我只是在学习围绕WCF的绳索。我打算做的是使用NetTcpBinding在客户端和服务器之间打开双工通道,并使其无限期保持打开状态,以便服务器可以向客户端发起请求。
然后我偶然发现了这个blog by Jesse Ezell,这似乎表明让频道无限期打开是一件坏事,因为你无法捕捉到错误,这会导致各种不稳定。
这是对的吗?如果我使用NetTcpBinding并在关系的任何一侧保持对开放通道的引用,那么如果通信失败会发生什么?我如何捕捉失败事件?还有其他什么问题?您使用的.NET框架有什么区别吗? (我在4.0。)
答案 0 :(得分:14)
我不同意Jesse(作为附注:他还建议你默认使用WCF服务类作为单身,这是我认为最糟糕的想法).... 。
只要你好好注意在服务器上捕获异常(例如在服务类中实现IErrorHandler
接口),就没有必要继续关闭你的频道...尤其不是在使用netTcpBinding的企业LAN环境。
与例如相反数据库连接通常会产生许可成本,保持与服务机器的网络连接不会导致任何问题。它通常也不是一个有限的资源,因此不断打开和关闭它似乎毫无意义。
如果您确实将服务频道保持打开状态较长时间,则需要在客户端能够处理故障 - 例如您需要能够从频道出现故障的情况中恢复,毕竟发生异常(例如网络故障或类似情况)。
但如果你这样做,那么我不会看到在每次通话后不断关闭你的频道,并重新开启下一个频道有任何好处......
答案 1 :(得分:7)
是的,一旦不再需要关闭频道,这是一个好习惯。但是在双工通信的情况下通常不常见。当您使用双工通信时,您需要打开通道以允许服务器将消息发送回客户端。 WCF通信始终由客户端启动。只有通过保持客户端打开的通道才允许回调。
双工通信涉及一些额外的任务来处理连接故障。您的服务应包含一些ping机制,以允许客户端定期检查连接。如果连接失败,客户端将收到异常,您将能够重新建立连接。此外,服务应该在将回调消息发送到故障通道时处理异常。