使用命名管道绑定为WCF服务生成代理类

本文关键字:服务生 WCF 代理 绑定 管道 | 更新日期: 2023-09-27 18:27:56

我正在尝试生成一个使用命名管道绑定的代理类,该代理类通过Windows服务本地托管。我对如何做到这一点感到困惑,因为我没有svcutil命令指向的URL。下面是我通过Windows服务打开主机时使用的方法。

host = new ServiceHost(typeof(MyCoolService.MyCoolService), new Uri[] { new Uri("net.pipe://localhost") });
            _host.AddServiceEndpoint(typeof(IMyCoolServiceObj),
                    new NetNamedPipeBinding(),
                    "MyCoolServicePipe");

目前,我正在使用ChannelFactory从客户端进行连接,但遇到的问题是,我发送给服务方法的参数在服务端被接收为空字符串。所以我想我应该尝试使用代理类来确保接口是正确的。

使用命名管道绑定为WCF服务生成代理类

您可以在内部定义绑定、服务、端点,然后使用ServiceReference添加服务并生成代理。

使用Channel Factory仍然可以。它将根据服务名称(类型)提取信息。

示例:

  using (System.ServiceModel.ServiceHost host = new System.ServiceModel.ServiceHost(typeof(SERVICETYPE), new Uri[] { }))

 <services>
      <service name="SERVICETYPE" behaviorConfiguration="serviceBehavior">
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8000"/>
          </baseAddresses>
  </services>
 <endpoint address="/END" binding="basicHttpBinding" bindingConfiguration="basicHttpBinding" contract="YOUR INTERFACE"/>

完成后,您将创建并使用"添加服务引用"生成代理。

"添加服务参考"仅适用于http协议

您需要在服务器配置端配置MEX(Meta Exchange)端点。完成后,您需要使用SVCUtil.exe生成客户端代理。

你可以查看这个链接来解决你的问题:MSDN NamedPipe激活

该链接还解释了如何使用WAS(Windows激活服务)使您的服务在IIS中可用,WAS是托管服务的一种更干净的方式。如果您不需要WAS,那么忘记他们配置IIS以启用命名管道作为协议的部分。如果您仍然遇到问题,请尝试添加一个基地址,并在svcutil命令中使用此地址,如下所示:

  <system.serviceModel>
    <services>
      <service name="Subject.Service1">
        <endpoint address="net.pipe://AddressName" binding="netNamedPipeBinding" name="netPipe" contract="Subject.IService1" />
        <endpoint binding="mexNamedPipeBinding" name="mex" contract="IMetadataExchange"/>
        <host>
          <baseAddresses>            
            <add baseAddress="net.pipe://localhost:9000/AddressName" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>...{config continues here}

SvcUtil命令:svcutil/d:"生成代码的目录位置"/config:"此处的配置文件名:app.config或web.config"/o:ClientProxyFileName.cs net。pipe://localhost:9000/AddressName/mex

如果你通过代码添加所有配置,你也可以看看这个例子:MSDN NetNamedPipeBinding类