Dot-Net
在雙工綁定 WCF 應用程序中處理丟棄的客戶端
我們在 WCF 應用程序中使用了一個發布-訂閱模型,該模型幾乎遵循 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 和垃圾收集器完成其餘的工作。