客户端尝试连接时,WCF服务主机返回“TCP错误10061 - 连接被拒绝”

时间:2010-05-05 21:56:48

标签: wcf

我使用netTcpBinding创建了一个自托管的WCF服务。我使用基于WinForm的客户端连接到此服务。我观察到,当客户端启动并运行时,我总是失去与WCF服务的连接 - 故障状态!

为了解决这个问题,我创建了一个线程来保持连接的活跃性。我让客户坐下来,大约一个星期后,在我的日志中发现了一条错误消息:TCP连接错误10061 - 客户端被拒绝连接。保持活动线程无法重新创建连接对象 - 日志仍显示“连接被拒绝”。

在我的服务主机配置文件中,我有一个基地址但没有端点地址。 MSDN说,当没有给出端点地址时,端点地址成为调用Open方法时的基址。

我是否还需要提供端点地址来解决“TCP连接被拒绝”问题?

提前感谢任何建议。

1 个答案:

答案 0 :(得分:2)

我认为主要的问题是你试图始终保持与WCF服务的“活动”连接。这不是使用WCF服务的方法。

在WCF中,建议的最佳做法是使用“每次呼叫”激活,例如您的客户端调用该服务,为该请求创建一个新的服务类隔离实例并对其进行处理,然后将其处理掉,客户端和服务器之间的连接基本上再次消失。

现在,NetTcpBinding的特殊之处在于它与服务器具有传输级会话。但是,你仍然应该

  • 创建客户端代理
  • 致电服务
  • 关闭客户端代理

作为一般规则。

此外,如果您的频道处于故障状态,则意味着您在服务器端发生了无法捕获和处理的.NET异常。在这种情况下,WCF进入“恐慌模式”并且基本上使通道无效 - 客户端和服务器之间的连接。毕竟,你的服务器端代码爆炸了 - 保持频道活着的重点是什么?

因此,在服务器端,您需要确保捕获并处理所有.NET异常,如果要将它们发送回客户端,请将它们转换为SOAP Faults(FaultException或{{ 1}})这样他们就不会破坏频道。查看WCF的IErrorHandler界面。

在您的客户端,您需要构建一些逻辑来检查故障通道状态,如果它确实出现故障,请将其丢弃并从头开始重新创建。

将所有这些位置于适当的位置,您应该可以毫无困难地使用您的WCF服务 - 没有像后台线程这样的黑客来“保持活跃”所需的连接。