WCF命名pipe道最小的例子

我正在寻找WCF命名pipe道的最小例子(我期待两个最小的应用程序,服务器和客户端,它们可以通过命名pipe道进行通信)。

微软有一个灿烂的文章入门教程 ,通过HTTP描述WCF,我正在寻找类似的WCF和命名pipe道。

我在互联网上发现了几个post,但他们有点“高级”。 我需要一些最小的,只有强制性的function,所以我可以添加我的代码,并获得应用程序工作。

我如何replace使用命名pipe道?

<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> 

我如何replace使用命名pipe道?

 // 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(); } 

如何生成一个客户端来使用命名pipe道?

我刚刚发现这个优秀的小教程 。 断开的链接 ( caching版本 )

我也跟着微软的教程很好,但我只需要pipe道。

正如你所看到的,你不需要configuration文件和所有那些混乱的东西。

顺便说一句,他使用HTTP和pipe道。 只要删除所有与HTTP相关的代码行,就会得到一个纯粹的pipe道示例。

尝试这个。

这是服务部分。

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

这是代理

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

这里是服务托pipe部分。

 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); } 

查看我的高度简化的Echo示例 :它旨在使用基本的HTTP通信,但可以通过编辑客户端和服务器的app.config文件轻松修改为使用命名pipe道。 进行以下更改:

编辑服务器的app.config文件,删除或注释掉http baseAddress条目,并为命名pipe道(称为net.pipe )添加一个新的baseAddress条目。 另外,如果您不打算将HTTP用于通信协议,请确保serviceMetadataserviceDebug已被注释掉或被删除:

 <configuration> <system.serviceModel> <services> <service name="com.aschneider.examples.wcf.services.EchoService"> <host> <baseAddresses> <add baseAddress="net.pipe://localhost/EchoService"/> </baseAddresses> </host> </service> </services> <behaviors> <serviceBehaviors></serviceBehaviors> </behaviors> </system.serviceModel> </configuration> 

编辑客户端的app.config文件,以便basicHttpBinding被注释掉或删除,并添加一个netNamedPipeBinding条目。 您还需要更改端点条目以使用pipe道:

 <configuration> <system.serviceModel> <bindings> <netNamedPipeBinding> <binding name="NetNamedPipeBinding_IEchoService"/> </netNamedPipeBinding> </bindings> <client> <endpoint address = "net.pipe://localhost/EchoService" binding = "netNamedPipeBinding" bindingConfiguration = "NetNamedPipeBinding_IEchoService" contract = "EchoServiceReference.IEchoService" name = "NetNamedPipeBinding_IEchoService"/> </client> </system.serviceModel> </configuration> 

上面的例子只能使用命名pipe道运行,但是没有任何东西阻止你使用多个协议来运行你的服务。 AFAIK,你应该可以让服务器使用命名pipe道和HTTP(以及其他协议)来运行服务。

此外,客户端的app.config文件中的绑定高度简化。 除了指定baseAddress之外,还有许多可以调整的参数。

我从互联网上的不同search结果创build了这个简单的例子。

 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; } 

使用上面的URI,我可以在客户端添加一个引用到Web服务。