使用命名管道绑定为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从客户端进行连接,但遇到的问题是,我发送给服务方法的参数在服务端被接收为空字符串。所以我想我应该尝试使用代理类来确保接口是正确的。
您可以在内部定义绑定、服务、端点,然后使用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类