【问题标题】:WCF service host returns "TCP error 10061 - connection refused" when client tries to connect当客户端尝试连接时,WCF 服务主机返回“TCP 错误 10061 - 连接被拒绝”
【发布时间】:2010-05-06 13:19:23
【问题描述】:

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

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

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

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

提前感谢您的任何建议。

【问题讨论】:

    标签: wcf


    【解决方案1】:

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

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

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

    • 创建客户端代理
    • 调用服务
    • 关闭客户端代理

    作为一般规则。

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

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

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

    将所有这些位放置到位,您的 WCF 服务应该完全没有问题 - 不需要像后台线程这样的黑客来“保持活动”所需的连接。

    【讨论】:

    • 我的应用程序的设计使得服务主机需要将异步消息发送回客户端。如果我要关闭客户端代理,如何从 WCF 服务获取异步回调?服务是否可以通过其他方式回调客户端?
    • @Subbu:好吧,你没有在你的问题中提到那个重要的部分!如果您需要双工通信,那么您需要更加小心,不要让任何 .NET 异常导致您的频道出现问题。
    • 如果我在使用客户端代理后关闭它,服务器是否可以通过其他方式发回消息?
    • @Subbu:来自服务的回调将在您有机会关闭客户端之前发生。这将在服务调用期间发生 - 一旦回调完成,您的客户端调用也将结束,因此您可以关闭客户端代理。
    猜你喜欢
    • 1970-01-01
    • 2014-01-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多