【问题标题】:generating proxy class for WCF service using named pipes binding使用命名管道绑定为 WCF 服务生成代理类
【发布时间】:2025-11-21 14:15:01
【问题描述】:

我正在尝试生成一个使用命名管道绑定的代理类,并通过 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 从我的客户端进行连接,但遇到了我发送到服务方法的参数在服务端作为空字符串接收的问题。所以我想我应该尝试使用代理类来确保接口完全正确。

【问题讨论】:

    标签: c# wcf namespaces named-pipes


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      例子:

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

      完成此操作后,创建使用“添加服务引用”来生成您的代理。

      【讨论】:

        【解决方案3】:

        “添加服务引用”仅适用于 http 协议

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

        您可以查看此链接以解决您的问题:MSDN NamedPipe Activation

        该链接还说明了如何使用 WAS(Windows 激活服务)使您的服务在 IIS 中可用,这是一种托管服务的更简洁的方式。如果您不需要 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 Class

        【讨论】: