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

WCF服务主机返回“;TCP错误10061-连接被拒绝;当客户端尝试连接时,wcf,Wcf,我使用netTcpBinding创建了一个自托管WCF服务。我正在使用基于WinForm的客户端连接到此服务。我观察到,当客户端启动并运行时,我总是失去与WCF服务的连接-错误状态 为了解决这个问题,我创建了一个线程来保持连接的活动状态。我让客户端静坐,大约一周后,在我的日志中发现一条错误消息:TCP连接错误10061-客户端被拒绝连接。保持活动状态线程无法重新创建连接对象-日志仍显示“连接被拒绝” 在服务主机的配置文件中,我有一个基址,但没有端点地址。MSDN说,当没有给定端点地址时,调用Op

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

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

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

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


提前感谢您的建议。

我认为主要的问题是您试图始终保持与WCF服务的“活动”连接。这不是WCF服务的实现方式

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

现在NetTcpBinding的特殊之处在于它与服务器之间有一个传输级会话。然而,你仍然应该这样做

  • 创建客户端代理
  • 呼叫服务
  • 关闭客户端代理
一般来说

此外,如果您的通道处于故障状态,这意味着您在服务器端发生的.NET异常不会被捕获和处理。在这种情况下,WCF进入“紧急模式”,基本上使通道(客户端和服务器之间的连接)无效。毕竟,您的服务器端代码刚刚崩溃-保持通道活动的意义何在

因此,在服务器端,您需要确保捕获并处理所有.NET异常,如果您想将它们发送回客户端,请将它们转换为SOAP错误(
FaultException
FaultException
),这样它们就不会重击通道。请查看WCF的接口

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


把所有这些信息放在适当的位置,你的WCF服务应该不会有任何问题——没有像后台线程这样的黑客来“保持”所需的连接

我的应用程序的设计使得服务主机需要将异步消息发送回客户端。如果关闭客户端代理,如何从WCF服务获取异步回调?有没有其他方法可以让服务回电给客户?@Subbu:嗯,你的问题中没有提到那个重要的部分!如果您需要双工通信,那么您需要更加小心,不要让任何.NET异常在您的通道上造成问题。如果我在使用客户端代理后关闭它,服务器是否有可能以另一种方式发回消息?@Subbu:在您有机会关闭客户端之前,服务将进行回调。它将在服务调用期间发生-回调完成后,您的客户端调用也将结束,因此您可以关闭客户端代理。