在双工绑定的WCF应用程序中处理断开连接的客户端

16
我们的 WCF 应用程序使用发布-订阅模型,基本上遵循了 Microsoft 的示例:Design Patterns: List-Based Publish-Subscribe
虽然该服务提供了 subscribe()unsubscribe() 的概念,但在客户端死亡或通道故障的情况下,处理清理的最佳实践是什么?当前,在客户端订阅时,我会将处理程序附加到当前 InstanceContextClosedFaulted 事件(服务使用 PerSession 实例上下文模式和 netTcpBinding)。
_communicationObject = OperationContext.Current.InstanceContext;
_communicationObject.Closed += OnClientLost;
_communicationObject.Faulted += OnClientLost;
OnClientLost处理程序仅取消订阅客户端,但是:
  1. 上述方法是否是一种良好的做法,仅仅足够强大以捕获客户端在双工通信中掉线的所有情况?或者服务应该在尝试与客户端通信时处理异常并在那时进行清理?
  2. 除了取消订阅客户回调处理程序之外,特别是在故障的情况下,是否应该执行进一步的清理操作?
这个问题提出了类似的问题,但最终没有提供超出客户端调用subscribe和/或unsubscribe的情况的答案。
谢谢
2个回答

8
我进行了一些测试,将处理程序附加到回调通道的关闭和故障事件上,然后在服务器尝试调用回调之前的时刻终止客户端。在每次测试中,关闭/故障事件立即触发,并且在服务器尝试调用回调之前触发。但是,由于客户端通道的销毁可能会在另一个线程进入回调时发生,因此我仍然将回调调用包装在try-catch块中。
唯一需要清理的就是删除对回调通道的引用。WCF和垃圾收集器会完成其余部分。

2
处理这些事件可以保持您的订阅者列表同步。它确实足够强大。只要记住,如果客户端在传输消息期间中断连接,您可能会在这些事件触发之前收到异常,因此请准备好忽略它们,以便事件可以进行清理。
除了从订阅者列表中删除客户端之外,其他清理完全取决于您的应用程序(即释放客户端连接时获取的资源)。我不知道是否需要进行任何其他清理。

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