WCF命名管道最小的例子

本文关键字:管道 WCF | 更新日期: 2023-09-27 18:07:56

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

微软有一篇精彩的文章Getting Started Tutorial描述了通过HTTP的WCF,我正在寻找关于WCF和命名管道的类似内容。

我在网上找到了一些帖子,但它们都有点"高级"。我需要一些最小的,只有强制性的功能,所以我可以添加我的代码,让应用程序工作。

我如何使用命名管道来替换它?

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

我如何使用命名管道来替换它?

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

如何生成客户端来使用命名管道?

WCF命名管道最小的例子

我刚找到这个很棒的小教程。 断裂链接(缓存版本)

我还遵循了微软的教程,这很好,但我只需要管道。

正如你所看到的,你不需要配置文件和所有那些乱七八糟的东西。

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

试试这个

这是服务部分。

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

这里是服务托管部分。

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文件,删除或注释掉http baseAddress条目,并为命名管道(称为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条目。您还需要更改端点条目以使用管道:

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

上面的例子将只运行命名管道,但没有什么可以阻止你使用多个协议来运行你的服务。我敢说,你应该能够让服务器同时使用命名管道和HTTP(以及其他协议)来运行服务。

同样,客户端的应用中的绑定。config文件是高度简化的。除了指定baseAddress

之外,还可以调整许多不同的参数。

我从互联网上不同的搜索结果中创建了这个简单的例子。

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服务添加一个引用。