Exemplo Mínimo de Canal Nomeado WCF

Estou procurando um exemplo mínimo de Pipes nomeados do WCF (espero dois aplicativos mínimos, servidor e cliente, que podem se comunicar por meio de um pipe nomeado).

A Microsoft tem o artigo Getting Started Tutorial, que descreve o WCF via HTTP, e estou procurando algo semelhante sobre o WCF e os pipes nomeados.

Eu encontrei vários posts na Internet, mas eles são um pouco “avançados”. Preciso de algo mínimo, apenas funcionalidade obrigatória, para poder adicionar meu código e fazer o aplicativo funcionar.

Como faço para replace isso para usar um pipe nomeado?

     

Como faço para replace isso para usar um pipe nomeado?

 // Step 1 of the address configuration procedure: Create a URI to serve as the base address. Uri baseAddress = new Uri("http://localhost:8000/ServiceModelSamples/Service"); // Step 2 of the hosting procedure: Create ServiceHost ServiceHost selfHost = new ServiceHost(typeof(CalculatorService), baseAddress); try { // Step 3 of the hosting procedure: Add a service endpoint. selfHost.AddServiceEndpoint( typeof(ICalculator), new WSHttpBinding(), "CalculatorService"); // Step 4 of the hosting procedure: Enable metadata exchange. ServiceMetadataBehavior smb = new ServiceMetadataBehavior(); smb.HttpGetEnabled = true; selfHost.Description.Behaviors.Add(smb); // Step 5 of the hosting procedure: Start (and then stop) the service. selfHost.Open(); Console.WriteLine("The service is ready."); Console.WriteLine("Press  to terminate service."); Console.WriteLine(); Console.ReadLine(); // Close the ServiceHostBase to shutdown the service. selfHost.Close(); } catch (CommunicationException ce) { Console.WriteLine("An exception occurred: {0}", ce.Message); selfHost.Abort(); } 

Como faço para gerar um cliente para usar um pipe nomeado?

Acabei de encontrar este excelente tutorial . link quebrado ( versão em cache )

Eu também segui o tutorial da Microsoft, que é bom, mas eu só precisava de canos também.

Como você pode ver, você não precisa de arquivos de configuração e todas essas coisas bagunçadas.

By the way, ele usa HTTP e pipes. Basta remover todas as linhas de código relacionadas ao HTTP e você obterá um exemplo de pipe puro.

Tente isso.

Aqui está a parte de serviço.

 [ServiceContract] public interface IService { [OperationContract] void HelloWorld(); } public class Service : IService { public void HelloWorld() { //Hello World } } 

Aqui está o procurador

 public class ServiceProxy : ClientBase { public ServiceProxy() : base(new ServiceEndpoint(ContractDescription.GetContract(typeof(IService)), new NetNamedPipeBinding(), new EndpointAddress("net.pipe://localhost/MyAppNameThatNobodyElseWillUse/helloservice"))) { } public void InvokeHelloWorld() { Channel.HelloWorld(); } } 

E aqui está a parte de hospedagem de serviços.

 var serviceHost = new ServiceHost (typeof(Service), new Uri[] { new Uri("net.pipe://localhost/MyAppNameThatNobodyElseWillUse") }); serviceHost.AddServiceEndpoint(typeof(IService), new NetNamedPipeBinding(), "helloservice"); serviceHost.Open(); Console.WriteLine("Service started. Available in following endpoints"); foreach (var serviceEndpoint in serviceHost.Description.Endpoints) { Console.WriteLine(serviceEndpoint.ListenUri.AbsoluteUri); } 

Confira o meu exemplo altamente simplificado do Echo : Ele foi projetado para usar a comunicação HTTP básica, mas pode ser facilmente modificado para usar pipes nomeados editando os arquivos app.config para o cliente e o servidor. Faça as seguintes alterações:

Edite o arquivo app.config do servidor, removendo ou comentando a input http baseAddress e adicionando uma nova input baseAddress para o pipe nomeado (chamado net.pipe ). Além disso, se você não pretende usar HTTP para um protocolo de comunicação, certifique-se de que serviceMetadata e serviceDebug sejam comentados ou excluídos:

                 

Edite o arquivo app.config do cliente para que o basicHttpBinding seja comentado ou excluído e uma input netNamedPipeBinding seja adicionada. Você também precisará alterar a input do terminal para usar o pipe:

             

O exemplo acima só será executado com pipes nomeados, mas nada está impedindo você de usar vários protocolos para executar seu serviço. AFAIK, você deve ser capaz de ter um servidor executando um serviço usando tanto pipes nomeados quanto HTTP (assim como outros protocolos).

Além disso, a binding no arquivo app.config do cliente é altamente simplificada. Existem muitos parâmetros diferentes que você pode ajustar, além de apenas especificar o baseAddress

Eu criei este exemplo simples de diferentes resultados de pesquisa na internet.

 public static ServiceHost CreateServiceHost(Type serviceInterface, Type implementation) { //Create base address string baseAddress = "net.pipe://localhost/MyService"; ServiceHost serviceHost = new ServiceHost(implementation, new Uri(baseAddress)); //Net named pipe NetNamedPipeBinding binding = new NetNamedPipeBinding { MaxReceivedMessageSize = 2147483647 }; serviceHost.AddServiceEndpoint(serviceInterface, binding, baseAddress); //MEX - Meta data exchange ServiceMetadataBehavior behavior = new ServiceMetadataBehavior(); serviceHost.Description.Behaviors.Add(behavior); serviceHost.AddServiceEndpoint(typeof(IMetadataExchange), MetadataExchangeBindings.CreateMexNamedPipeBinding(), baseAddress + "/mex/"); return serviceHost; } 

Usando o URI acima, posso adicionar uma referência em meu cliente ao serviço da web.