2011-03-03 127 views
0

我正在創建一個使用WCF雙工回調的客戶端服務應用程序。該服務將消息發送給所有連接的客戶端。我將所有連接的客戶端存儲在字典中。在發送消息給客戶端之前,我想檢查是否有客戶端異常關閉(網絡斷開,關閉電源)。檢查wcf客戶端連接

@marc_s:我創建了一個CheckCallbackChannels方法,它將檢查字典中連接客戶端的通信狀態。

Sub CheckCallbackChannel() 
    For Each objClient As KeyValuePair(Of Guid, IClientCallBack) In MainService.objClients 
     Dim objClientCallBack As IClientCallBack = MainService.objClients.Item(objClient.Key) 
     Dim callbackChannel As ICommunicationObject = TryCast(mobjClientCallBack,ICommunicationObject) 
     'Dim state As CommunicationState = callbackChannel.State 
     If callbackChannel.State = CommunicationState.Opened OrElse callbackChannel.State = CommunicationState.Faulted Then 
      MainService.objClients.Remove(objClient.Key) 
     End If 
    Next 
End Sub 

但在這裏我得到的狀態連接故障客戶端也。

+0

@marc_s:我創建了一個CheckCallbackChannels方法,它將檢查字典中連接客戶端的所有通信狀態狀態。 – AKP 2011-03-04 04:50:12

回答

2

是的,您可以在每個服務合同中包含一個Ping()方法,並在實際調用之前調用該方法。

但是,這真的告訴你什麼?

首先,即使對.Ping()的調用可能會導致異常(因爲服務已經消失,超載等等)。

如果它成功了 - 它可以讓你絕對不能保證,你對同樣的服務下一個電話,一微秒後,有成功的任何機會....

基本上,我覺得這種做法浪費 - 你需要編寫大量的代碼,最終,它確實不會給你任何有意義的信息。

你需要做的是:準備服務調用它可以失敗 - 無論出於何種原因。不要浪費你的時間和處理週期在你的系統周圍進行ping - 無論如何它不會給你任何有意義的信息。

只需進行服務調用,準備好處理故障(並可能回收您的WCF代理) - 這就是您真正可以做的。