WCF - 长时间保持通道开启是否不良实践?

9
我正在学习WCF。我的计划是使用NetTcpBinding在客户端和服务器之间建立双工通道,并保持该通道无限期打开,以便服务器可以向客户端发起请求。然而,我偶然发现了Jesse Ezell的博客,它似乎表明长时间保持通道打开是一件不好的事情,因为你无法捕获故障,这会导致各种不稳定性。这是正确的吗?如果我在关系的任一侧保持对打开通道的引用,并使用NetTcpBinding,那么如果有通信故障会发生什么?如何捕获故障事件?还有哪些需要注意的地方?使用哪个.NET框架是否有区别?(我使用的是4.0版本。)
2个回答

15

我不同意Jesse的观点(额外提醒:他还建议默认将WCF服务类用作单例,这在我看来是最糟糕的想法)...

只要您在服务器上慎重处理异常(例如通过实现服务类中的IErrorHandler接口),就没有必要不断关闭通道,尤其是在使用netTcpBinding的公司LAN环境中。

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

如果您长时间保持服务通道打开,则需要能够在客户端处理故障-例如,当通道已故障时,您需要能够从异常情况中恢复(例如,网络已关闭或类似问题)。

但是,如果您这样做,那么我不认为在每次调用后不断关闭通道并重新打开对于性能有任何好处...


7

关闭渠道的好习惯是在不再需要时尽早关闭。 但是,在双向通信中,这种做法并不常见。 当您使用双向通信时,需要打开通道以允许服务器向客户端发送消息。 WCF通信始终由客户端发起。 只有通过保持由客户端启动的通道才允许回调。

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接