9

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

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

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

4

2 回答 2

14

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

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

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

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

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

于 2011-01-02T13:38:20.957 回答
7

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

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

于 2011-01-02T13:10:28.277 回答