处理双工绑定WCF应用程序中的已删除客户端

时间:2011-01-01 01:05:32

标签: .net wcf duplex publish-subscribe

我们在WCF应用程序中使用了pub-sub模型,该模型几乎遵循Microsoft示例:Design Patterns: List-Based Publish-Subscribe

虽然该服务提供了subscribe()unsubscribe()的概念,但在客户端死亡或通道出现故障时处理清理的最佳做法是什么?目前,当客户端订阅时,我将处理程序附加到当前InstanceContext的{​​{1}}和Closed事件(服务用户是PerSession实例上下文模式和netTcpBinding):

Faulted

_communicationObject = OperationContext.Current.InstanceContext; _communicationObject.Closed += OnClientLost; _communicationObject.Faulted += OnClientLost; 处理程序只是取消订阅客户端,但是:

  1. 以上是一个好的做法,并且足够强大,能够在客户端断开双工通信时捕获所有情况吗?或者,服务是否应该只处理在尝试与客户端通信并处理清理时遇到的异常?
  2. 除了取消订阅客户端回调处理程序之外,是否应该进行任何进一步的清理,尤其是在出现故障的情况下?
  3. This question提出了类似的问题,但最终没有提供客户调用订阅和/或取消订阅之外的案例的答案

    由于

2 个答案:

答案 0 :(得分:8)

我做了一些测试,我将处理程序附加到回调通道的Closed和Faulted事件,然后在服务器调用回调之前就杀死了客户端。在每次试验中,Closed / Faulted事件在服务器尝试调用回调之前立即触发。尽管如此,我仍然将回调调用包装在try-catch块中,因为客户端通道的破坏可能发生在另一个线程进入回调时。

唯一需要清理的是删除对回调通道的引用。 WCF和垃圾收集器完成剩下的工作。

答案 1 :(得分:2)

处理这些事件会使您的订阅者列表保持同步。它确实足够强大。请记住,如果客户端在传输消息期间丢失,您可能会在这些事件触发之前获得异常,因此请准备好忽略它们以便事件可以清理。

除了从订户列表中删除客户端之外,额外的清理完全取决于您的应用程序(即释放客户端连接时获取的资源)。我不知道需要进行任何其他清理工作。