调用WCF服务触发There was no endpoint listening错误,求排查方案
解决WCF调用时「There was no endpoint listening」异常
嘿,针对你遇到的这个问题,我来分享几个实际开发中踩过坑总结出来的排查和解决方向:
1. 先确认服务端点地址完全正确
首先得检查客户端配置文件(app.config/web.config)里的<endpoint>节点的address属性,是不是和WCF服务实际暴露的地址完全匹配:
- 你可以直接在浏览器里访问服务的元数据地址(比如
http://localhost:xxxx/PriceService.svc),先确认服务本身能正常访问,地址没有拼写错误、端口号不对或者协议搞错(比如服务用的是http,客户端配置成了https)。 - 打开客户端的config文件,找到
<client>下的<endpoint>节点,对比address值和服务实际地址,哪怕多一个斜杠或者字母大小写不对都可能出问题。
2. 检查绑定配置和服务端完全一致
WCF的客户端和服务端绑定配置必须完全匹配,比如服务端用的是basicHttpBinding,客户端不能用wsHttpBinding:
- 去服务端的web.config里找到
<bindings>节点,再对比客户端app.config里的对应绑定配置,确保绑定类型、安全模式、超时时间这些参数都一模一样。
3. 验证SOAP动作是否符合服务端要求
异常提示里提到了SOAP动作的问题,你可以这么排查:
- 启用WCF跟踪日志,查看客户端发送的SOAP请求具体内容,确认请求里的SOAP动作是不是和服务端期望的一致。
- 如果确实是动作不匹配,也可以在客户端代码里手动指定SOAP动作,比如加个自定义端点行为:
// 在调用服务前添加这段代码 ns.Endpoint.EndpointBehaviors.Add(new CustomEndpointBehavior()); // 自定义行为类 public class CustomEndpointBehavior : IEndpointBehavior { public void ApplyDispatchBehavior(ServiceEndpoint endpoint, EndpointDispatcher endpointDispatcher) { } public void AddBindingParameters(ServiceEndpoint endpoint, BindingParameterCollection bindingParameters) { } public void ApplyClientBehavior(ServiceEndpoint endpoint, ClientRuntime clientRuntime) { foreach (var operation in clientRuntime.Operations) { operation.ClientRequestInspectors.Add(new CustomRequestInspector()); } } public void Validate(ServiceEndpoint endpoint) { } } public class CustomRequestInspector : IClientMessageInspector { public object BeforeSendRequest(ref Message request, IClientChannel channel) { // 替换成你服务端实际的SOAP动作地址 request.Headers.Action = "http://your-service-namespace/GetPricesData"; return null; } public void AfterReceiveReply(ref Message reply, object correlationState) { } }
4. 确认服务本身在正常运行
- 如果是IIS托管的服务,检查对应的应用程序池是不是处于启动状态,有没有报错。
- 如果是自托管服务,确认服务进程有没有在运行,会不会被杀毒软件或者后台进程杀掉了。
5. 排查网络和防火墙问题
如果服务在远程服务器上,得确认网络连通性:
- 先试试在客户端机器上ping服务器IP,看能不能通;再用
telnet 服务器IP 端口号测试端口是否开放,连接失败的话就是防火墙或者网络策略拦截了。 - 如果是本地服务,也得确认本地防火墙有没有拦截服务端口。
6. 重新生成服务引用
有时候添加服务引用时可能因为元数据更新不及时,导致生成的代理类或者配置有问题:
- 删除现有的
ServiceReferenceIHS服务引用,重新通过「添加服务引用」功能添加,添加时尽量选择最新的元数据,必要时可以勾选「始终生成消息合同」选项。
内容的提问来源于stack exchange,提问作者user1196392
相关产品推荐
相关产品推荐

