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 canal nomeado).
A Microsoft tem o brilhante artigo Getting Started Tutorial que descreve o WCF via HTTP, e estou procurando algo semelhante sobre WCF e pipes nomeados.
Encontrei vários posts na Internet, mas 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 substituir isso para usar um pipe nomeado?
<endpoint address="http://localhost:8000/ServiceModelSamples/Service/CalculatorService"
binding="wsHttpBinding" bindingConfiguration="WSHttpBinding_ICalculator"
contract="ICalculator" name="WSHttpBinding_ICalculator">
<identity>
<userPrincipalName value="OlegPc\Oleg" />
</identity>
</endpoint>
Como faço para substituir 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 <ENTER> 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?
c#
wcf
named-pipes
javapowered
fonte
fonte
Respostas:
Acabei de encontrar este excelente pequeno tutorial .link quebrado ( versão em cache )Eu também segui o tutorial da Microsoft, o que é bom, mas também precisava apenas de pipes.
Como você pode ver, você não precisa de arquivos de configuração e todas essas coisas complicadas.
A propósito, ele usa HTTP e pipes. Apenas remova todas as linhas de código relacionadas ao HTTP e você obterá um exemplo de pipe puro.
fonte
Experimente isso.
Aqui está a parte do serviço.
Aqui está o proxy
E aqui está a parte de hospedagem de serviços.
fonte
/helloservice
ao final do endereço do terminal no proxy.Confira meu exemplo altamente simplificado do Echo : ele é projetado para usar comunicação HTTP básica, mas pode ser facilmente modificado para usar pipes nomeados editando os arquivos app.config para o cliente e servidor. Faça as seguintes alterações:
Edite o arquivo app.config do servidor , removendo ou comentando a entrada http baseAddress e adicionando uma nova entrada baseAddress para o canal nomeado (chamado net.pipe ). Além disso, se você não pretende usar HTTP para um protocolo de comunicação, verifique se o serviceMetadata e serviceDebug ou é comentado ou excluído:
Edite o arquivo app.config do cliente para que basicHttpBinding seja comentada ou excluída e uma entrada netNamedPipeBinding seja adicionada. Você também precisará alterar a entrada do ponto final para usar o tubo:
O exemplo acima só será executado com canais nomeados, mas nada o impede de usar vários protocolos para executar seu serviço. AFAIK, você deve conseguir fazer com que um servidor execute um serviço usando pipes nomeados e HTTP (bem como outros protocolos).
Além disso, a vinculação no arquivo app.config do cliente é altamente simplificada. Existem muitos parâmetros diferentes que você pode ajustar, além de apenas especificar o baseAddress ...
fonte
Criei este exemplo simples a partir de diferentes resultados de pesquisa na internet.
Usando o URI acima, posso adicionar uma referência ao serviço da web em meu cliente.
fonte
Achei este site muito útil, e o projeto de exemplo é executado sem nenhum ajuste: https://dotnet-experience.blogspot.com/2012/02/inter-process-duplex-communication-with.html
Não se esqueça de habilitar o suporte a Named Pipe nos Recursos do Windows. Este artigo tem algumas boas capturas de tela para esse efeito na resposta principal: WCF Named Pipe no Windows Service usando App.Config
O projeto referenciado na solução aceita não funciona como está no meu PC. Tentei algumas correções no app.config, mas ainda recebo a seguinte exceção:
fonte