2010-05-05 67 views
1

我使用netTcpBinding创建了一个自托管的WCF服务。我正在使用基于WinForm的客户端连接到此服务。我发现当客户端启动并运行时,我总是失去与WCF服务的连接 - 出现故障状态!当客户端尝试连接时,WCF服务主机返回“TCP错误10061 - 连接被拒绝”

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

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

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

在此先感谢您的任何建议。

回答

2

我认为主要的问题是,你总是试图保持一个连接“活着”到WCF服务。这不是用WCF服务来完成的。

在WCF中,推荐的最佳做法是使用“每次通话”激活,例如,客户端调用该服务,为该请求创建一个新的服务类实例并对其进行处理,然后对其进行处理,客户端和服务器之间的连接基本上再次完成。

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

  • 创建客户端代理
  • 呼叫服务
  • 关闭客户端代理

作为一般规则。此外,如果您的频道处于故障状态,这意味着您在服务器端发生了.NET异常,这些异常不会被捕获和处理。在这种情况下,WCF进入“恐慌模式”,基本上使通道无效 - 客户端与服务器之间的连接。毕竟,你的服务器端代码刚刚爆炸 - 保持频道活跃的关键点是什么?因此,在服务器端,您需要确保捕获并处理所有.NET异常,并且如果要将它们发回给客户端,请将它们转换为SOAP Faults(FaultExceptionFaultException<T>),以便它们不会击败频道。查看WCF的IErrorHandler界面。

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

把所有这些东西放在适当的位置上,对于WCF服务应该没有任何问题 - 没有像后台线程那样的黑客需要“保持活动”连接。

+0

非常感谢。 – Subbu 2010-05-06 15:58:05

+0

我的应用程序的设计是这样的,服务主机需要将异步消息发送回客户端。如果我要关闭客户端代理,如何从WCF服务获取异步回调?服务是否有另一种方式可以回拨给客户? – Subbu 2010-05-06 17:13:54

+0

@Subbu:好吧,你没有在你的问题中提及这一点。如果您需要双工通信,那么您需要更加小心,不要让.NET异常导致您的频道出现问题。 – 2010-05-06 18:03:52

相关问题