WCF 服务:配置地址

Posted

技术标签:

【中文标题】WCF 服务:配置地址【英文标题】:WCF Service : config address 【发布时间】:2017-12-17 11:37:17 【问题描述】:

在我的 WCF 服务 App.config 我有:

<services>
  <service behaviorConfiguration="MyServiceWcfBehavior" name="MyService">
    <clear />
    <endpoint address="net.tcp://localhost:9999/MyService" binding="customBinding" bindingConfiguration="MyServiceTcpBinding" name="MyServiceWcfTcpEndpoint" contract="MyService.Contracts.Interfaces.IMy" />
  </service>
</services>

在我的测试客户端 App.config 我有:

<client>
  <endpoint address="net.tcp://localhost:9999/MyService" behaviorConfiguration="MyServiceEndpointBehavior" binding="customBinding" bindingConfiguration="MyServiceCustomTcpBinding" contract="MyService.Contracts.Interfaces.IMy" name="MyServiceWcfTcpEndpoint" />
</client>

然后我像这样实例化我的ServiceHost

var host = new ServiceHost(typeof(MyService),new Uri(net.tcp://localhost:9999/MyService));
host.Open();

但是在运行我的服务然后用我的客户端进行测试(调用我的服务中定义的通道端点)我得到运行时异常:

System.ServiceModel.FaultException`1 未处理 行动=http://schemas.microsoft.com/net/2005/12/windowscommunicationfoundation/dispatcher/fault H结果=-2146233087 Message=该方法或操作未实现。 源=mscorlib 堆栈跟踪: 服务器堆栈跟踪: 在 System.ServiceModel.Channels.ServiceChannel.ThrowIfFaultUnderstood(消息 回复、MessageFault 故障、字符串操作、MessageVersion 版本、 故障转换器故障转换器) 在 System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime 操作,ProxyRpc&rpc) 在 System.ServiceModel.Channels.ServiceChannel.Call(String action, Boolean oneway, ProxyOperationRuntime operation, Object[] ins, Object[] 出局,TimeSpan 超时) 在 System.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage methodCall、ProxyOperationRuntime 操作) 在 System.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage 信息) 在 [0] 处重新抛出异常: 在 System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessage reqMsg, IMessage retMsg) 在 System.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(消息数据& msgData,Int32 类型)

【问题讨论】:

您尝试通过测试客户端调用的方法是否已在服务中实现? 【参考方案1】:

使用端口共享时,需要将NetTcpBinding 设置为PortSharingEnabledtrue 传递给构造函数:

portsharingBinding = new NetTcpBinding();
portsharingBinding.PortSharingEnabled = true;

var host = new ServiceHost(typeof(MyService), portsharingBinding, new Uri("net.tcp://localhost:9999/MyService"));
host.Open();

另外,您是否确保您的服务实现了一个带有ServiceContract 的接口

[ServiceContract]
interface IMyService 

    //Define the contract operations.  


class MyService : IMyService 
  
    //Implement the IMyService operations. 

还要确保配置中的合约 MyService.Contracts.Interfaces.IMy 与该接口完全匹配。这是区分大小写的。

【讨论】:

对不起,我是如何使用端口共享的?您为 ServiceHost 提供的重载似乎也不存在。我所拥有的只是将 URI 作为第二个参数的重载 您使用的是什么版本的 .net? docs.microsoft.com/en-us/dotnet/framework/wcf/feature-details/…

以上是关于WCF 服务:配置地址的主要内容,如果未能解决你的问题,请参考以下文章

WCF学习之旅—WCF服务配置(十四)

四WCF的配置文件

WCF系列如何配置和承载服务

使用 wsHttpBinding 配置 WCF 服务

WCF入门二[WCF的配置文件]

WCF入门教程四[WCF的配置文件]