WCF - 长时间打开通道是不好的做法吗?

Posted

技术标签:

【中文标题】WCF - 长时间打开通道是不好的做法吗?【英文标题】:WCF - is it bad practice to leave a channel open for a long time? 【发布时间】:2011-06-02 11:35:44 【问题描述】:

我只是在学习 WCF 的基本知识。我打算做的是使用 NetTcpBinding 在客户端和服务器之间打开一个双工通道,并无限期地保持打开状态,以便服务器可以向客户端发起请求。

然后我偶然发现了这个blog by Jesse Ezell,这似乎表明无限期地保持通道打开是一件坏事,因为你无法捕捉到错误,这会导致各种不稳定。

正确吗?如果我使用 NetTcpBinding 并在关系的任一侧保留对开放通道的引用,如果通信失败会发生什么情况?如何捕获失败事件?还有哪些其他问题?您使用的 .NET 框架有什么区别吗? (我在 4.0。)

【问题讨论】:

【参考方案1】:

我不同意 Jesse 的观点(作为旁注:他还建议您默认使用 WCF 服务类作为单例,这是我认为有史以来最糟糕的想法).... .

只要您注意在服务器上捕获异常(例如,通过在您的服务类中实现IErrorHandler 接口),就没有必要继续关闭您的频道……尤其是在公司局域网中使用 netTcpBinding 的环境。

与例如相反通常会产生许可成本的数据库连接,保持与您的服务机器的网络连接打开应该不会导致任何问题。它通常也不是有限的资源,因此不断打开和关闭它似乎毫无意义。

如果您确实让您的服务通道打开了更长的时间,您需要能够在客户端处理故障 - 例如您需要能够从通道发生故障的情况中恢复,毕竟发生异常(例如网络关闭或类似情况)。

但是,如果您这样做,那么我认为在每次通话后不断关闭您的频道并重新打开下一个频道没有任何好处...

【讨论】:

【参考方案2】:

是的,最好在不再需要频道时立即关闭频道。但在双工通信的情况下并不常见。当您使用双工通信时,您需要打开通道以允许服务器将消息发送回客户端。 WCF 通信始终由客户端发起。只有保持客户端发起的通道打开,才允许回调。

双工通信涉及一些额外的任务来处理连接失败。您的服务应该包含一些 ping 机制,以允许客户端定期检查连接。如果连接失败客户端收到异常,您将能够重新建立连接。服务也应该在向故障通道发送回调消息时处理异常。

【讨论】:

以上是关于WCF - 长时间打开通道是不好的做法吗?的主要内容,如果未能解决你的问题,请参考以下文章

不活动后出现错误的 WCF 双工回调 - 保持活动长时间运行的推送通知

对长时间运行的通知通道使用 ServerStreaming rpc 调用

WCF:是不是可以在双工通道中使用流模式?

如果出现故障,如何自动重新建立双工通道?

重复调用的 WCF 通道生命周期

保持 wcf 回调通道无限期打开/如果出现故障则从客户端重新连接