[英]Handling dropped clients in a duplex binding WCF application
我們在WCF應用程序中使用了pub-sub模型,該模型幾乎遵循Microsoft示例: 設計模式:基於列表的發布 - 訂閱 。
雖然該服務提供了subscribe()
和unsubscribe()
的概念,但在客戶端死亡或通道出現故障時處理清理的最佳做法是什么? 目前,當客戶端訂閱時,我將處理程序附加到當前InstanceContext
的Closed
和Faulted
事件(服務用戶PerSession實例上下文模式和netTcpBinding):
_communicationObject = OperationContext.Current.InstanceContext;
_communicationObject.Closed += OnClientLost;
_communicationObject.Faulted += OnClientLost;
OnClientLost
處理程序只是取消訂閱客戶端,但是:
這個問題提出了類似的問題,但最終沒有提供客戶呼叫訂閱和/或取消訂閱之外的案例的答案
謝謝
我做了一些測試,我將處理程序附加到回調通道的Closed和Faulted事件,然后在服務器調用回調之前就殺死了客戶端。 在每次試驗中,Closed / Faulted事件在服務器嘗試調用回調之前立即觸發。 盡管如此,我仍然將回調調用包裝在try-catch塊中,因為客戶端通道的破壞可能發生在另一個線程進入回調時。
唯一需要清理的是刪除對回調通道的引用。 WCF和垃圾收集器完成剩下的工作。
處理這些事件將使您的訂閱者列表保持同步。 它確實足夠強大。 請記住,如果客戶端在傳輸消息期間丟失,您可能會在這些事件觸發之前獲得異常,因此請准備好忽略它們以便事件可以清除。
除了從客戶列表中刪除客戶端之外,額外的清理完全取決於您的應用程序(即釋放客戶端連接時獲得的資源)。 我不知道需要進行任何其他清理工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.