我使用netTcpBinding创建了一个自托管的WCF服务。我使用基于WinForm的客户端连接到此服务。我观察到,当客户端启动并运行时,我总是失去与WCF服务的连接 - 故障状态!
为了解决这个问题,我创建了一个线程来保持连接的活跃性。我让客户坐下来,大约一个星期后,在我的日志中发现了一条错误消息:TCP连接错误10061 - 客户端被拒绝连接。保持活动线程无法重新创建连接对象 - 日志仍显示“连接被拒绝”。
在我的服务主机配置文件中,我有一个基地址但没有端点地址。 MSDN说,当没有给出端点地址时,端点地址成为调用Open方法时的基址。
我是否还需要提供端点地址来解决“TCP连接被拒绝”问题?
提前感谢任何建议。
答案 0 :(得分:2)
我认为主要的问题是你试图始终保持与WCF服务的“活动”连接。这不是使用WCF服务的方法。
在WCF中,建议的最佳做法是使用“每次呼叫”激活,例如您的客户端调用该服务,为该请求创建一个新的服务类隔离实例并对其进行处理,然后将其处理掉,客户端和服务器之间的连接基本上再次消失。
现在,NetTcpBinding的特殊之处在于它与服务器具有传输级会话。但是,你仍然应该
作为一般规则。
此外,如果您的频道处于故障状态,则意味着您在服务器端发生了无法捕获和处理的.NET异常。在这种情况下,WCF进入“恐慌模式”并且基本上使通道无效 - 客户端和服务器之间的连接。毕竟,你的服务器端代码爆炸了 - 保持频道活着的重点是什么?
因此,在服务器端,您需要确保捕获并处理所有.NET异常,如果要将它们发送回客户端,请将它们转换为SOAP Faults(FaultException
或{{ 1}})这样他们就不会破坏频道。查看WCF的IErrorHandler界面。
在您的客户端,您需要构建一些逻辑来检查故障通道状态,如果它确实出现故障,请将其丢弃并从头开始重新创建。
将所有这些位置于适当的位置,您应该可以毫无困难地使用您的WCF服务 - 没有像后台线程这样的黑客来“保持活跃”所需的连接。