簡體   English   中英

處理雙工綁定WCF應用程序中的已刪除客戶端

[英]Handling dropped clients in a duplex binding WCF application

我們在WCF應用程序中使用了pub-sub模型,該模型幾乎遵循Microsoft示例: 設計模式:基於列表的發布 - 訂閱

雖然該服務提供了subscribe()unsubscribe()的概念,但在客戶端死亡或通道出現故障時處理清理的最佳做法是什么? 目前,當客戶端訂閱時,我將處理程序附加到當前InstanceContextClosedFaulted事件(服務用戶PerSession實例上下文模式和netTcpBinding):

_communicationObject = OperationContext.Current.InstanceContext;
_communicationObject.Closed += OnClientLost;
_communicationObject.Faulted += OnClientLost;

OnClientLost處理程序只是取消訂閱客戶端,但是:

  1. 以上是一個好的做法,並且足夠強大,能夠在客戶端斷開雙工通信時捕獲所有情況嗎? 或者服務是否應該只處理在嘗試與客戶端通信並處理清理時遇到的異常?
  2. 除了取消訂閱客戶端回調處理程序之外,是否應該執行任何進一步的清理,特別是在出現故障的情況下?

這個問題提出了類似的問題,但最終沒有提供客戶呼叫訂閱和/或取消訂閱之外的案例的答案

謝謝

我做了一些測試,我將處理程序附加到回調通道的Closed和Faulted事件,然后在服務器調用回調之前就殺死了客戶端。 在每次試驗中,Closed / Faulted事件在服務器嘗試調用回調之前立即觸發。 盡管如此,我仍然將回調調用包裝在try-catch塊中,因為客戶端通道的破壞可能發生在另一個線程進入回調時。

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

處理這些事件將使您的訂閱者列表保持同步。 它確實足夠強大。 請記住,如果客戶端在傳輸消息期間丟失,您可能會在這些事件觸發之前獲得異常,因此請准備好忽略它們以便事件可以清除。

除了從客戶列表中刪除客戶端之外,額外的清理完全取決於您的應用程序(即釋放客戶端連接時獲得的資源)。 我不知道需要進行任何其他清理工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM