2011-09-02 164 views
6

我有一個工作的雙工WCF服務與WSDualHttpBinding。我的問題是想出一個方法來存儲具有唯一ID的回調通道。該服務旨在長期運行。當調用「訂閱」方法時,我可以簡單地獲取OperationContext.Current.GetCallbackChannel()返回值並將其存儲在列表或字典中嗎?它保證有效,直到連接活着?識別WCF服務中的客戶端

回答

5

最簡單的方法是讓客戶端在服務的Subscribe方法中提交一個鍵值。然後,您可以將回撥通道保存在字典中。這個字典可能需要是一個靜態變量或者單例類,它們的生命週期大於服務類的生命週期,因爲大多數服務類都有一個PerCall生命週期,並在服務調用完成後得到處理。謹防線程問題!

回調通道可能在客戶端或服務端隨時發生故障。該服務必須處理故障頻道的可能性並從字典中刪除故障頻道。 WSDuallHttpBinding是一個「無狀態」綁定,因此客戶端的任何錯誤都不會在服務端檢測到,直到服務端嘗試調用它們。如果客戶端進入故障狀態,NetTcpBinding將引發ChannelFaulted事件。出於這個原因,如果它符合你的要求,我會推薦NetTcpBinding。

public bool Subscribe(string id) { 
     ICallback callback = OperationContext.Current.GetCallbackChannel(); 
     if (!_activeCallbackChannels.Contains(id)) { 
      _activeCallbackChannels.Add(id, callback); 
      return true; 
     } 
     else { 
      return false; 
     } 

    }