我们在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;
处理程序只是取消订阅客户端,但是:
This question提出了类似的问题,但最终没有提供客户调用订阅和/或取消订阅之外的案例的答案
由于
答案 0 :(得分:8)
我做了一些测试,我将处理程序附加到回调通道的Closed和Faulted事件,然后在服务器调用回调之前就杀死了客户端。在每次试验中,Closed / Faulted事件在服务器尝试调用回调之前立即触发。尽管如此,我仍然将回调调用包装在try-catch块中,因为客户端通道的破坏可能发生在另一个线程进入回调时。
唯一需要清理的是删除对回调通道的引用。 WCF和垃圾收集器完成剩下的工作。
答案 1 :(得分:2)
处理这些事件会使您的订阅者列表保持同步。它确实足够强大。请记住,如果客户端在传输消息期间丢失,您可能会在这些事件触发之前获得异常,因此请准备好忽略它们以便事件可以清理。
除了从订户列表中删除客户端之外,额外的清理完全取决于您的应用程序(即释放客户端连接时获取的资源)。我不知道需要进行任何其他清理工作。