2014-07-20 89 views
0

我有一個使用netTCPBinding在雙工通道上工作的WCF服務和WCF客戶端。在調用WCF中的回調方法之前檢查客戶端狀態

我連接的用戶存儲在一個字典(Dictionary<int userID,CallbackInstance instance>

當用戶經常斷開連接,從服務調用Disconnect,我從我的連接用戶列表中刪除用戶。它工作正常。

但是當客戶端pc斷開連接時,客戶端無法調用Disconnect方法,因此客戶端仍然在連接的用戶列表中,這就是問題所在。因爲當我的WCF服務器爲在線用戶檢查服務器的回調時,服務器嘗試調用客戶端的回調方法,但客戶端不可用,並且我的WCF服務器應用程序崩潰。

是否可以在調用回調實例之前檢查客戶端狀態?

回答

0

確保將所有屬性超時設置爲自動刪除非活動客戶端,然後捕獲try catch塊中的超時異常並將其從字典中刪除。

+0

**確保所有屬性超時設置爲自動刪除非活動客戶** - 很抱歉,但我不知道該怎麼做 –

+0

@WaelGamal只需設置各種超時屬性,然後換你的聽衆/發件人在try catch塊中以捕獲超時異常 – Wobbles

+0

@WaelGamal http://msdn.microsoft.com/en-us/library/system.servicemodel.nettcpbinding(v=vs.110).aspx http:// msdn .microsoft.com/en-us/library/0yd65esw.aspx – Wobbles

0

我解決這個問題有:

1.Method從客戶端來ping服務器保持連接如主動爲每30秒。

2.在服務器綁定,ReceiveTimeout 1分鐘。

3.Foreach回調創建了IcommunicationObject,使用Closed事件刪除非活動客戶端。

//Adding a client callback 

OperationContext context = OperationContext.Current; 
ICallback callback = context.GetCallbackChannel(); 
ICommunicationObject obj = (ICommunicationObject)callback; 
obj.Closed += new EventHandler(obj_Closed); 



//Event for inactive clients 
void obj_Closed(object sender, EventArgs e) 
    { 
     if (_callbacks.ContainsValue(((ITecnobelRemoteServiceCallback)sender))) 
     { 
      var item = _callbacks.First(kvp => kvp.Value == ((ITecnobelRemoteServiceCallback)sender)); 
      _callbacks.Remove(item.Key); 
      treeViewClients.Nodes.RemoveByKey(item.Key.Id); 
      treeViewClients.Refresh(); 
      _registeredUsers--; 
      listBoxStatus.Items.Add(String.Format("Usuário {0} estava inativo e foi removido", item.Key.Id)); 
     } 
    }