2011-08-03 61 views
2

我有關於檢查WCF連接是否打開的問題。我的WCF連接是雙向的。我使用State屬性來檢查客戶端的連接狀態。我的功能:關於檢查WCF連接的問題已打開

private bool ConnectionIsOpen() 
{ 
    if (m_Service != null && (m_Service.State | CommunicationState.Opened) == CommunicationState.Opened) 
    { 
     return true; 
    } 
    return false; 
} 

我創建了一個服務,這是每隔10秒,檢查連接的狀態的線程。我使用ConnectionIsOpen()方法進行檢查。在Windows XP上運行一切都很順利。但是,在Windows 7上運行時出現問題。

當我拔掉網線以創建斷開連接時,如果在Windows XP上運行應用程序,檢查連接的狀態爲Faulted,但如果在Windows 7上運行,檢查連接狀態爲仍然開放。

任何人都可以幫助我如何檢查連接openned或不在此例。謝謝。

+0

你的if語句看起來很滑稽......爲什麼不乾脆: 如果(m_Service = NULL && m_Service.State == CommunicationState!打開) – c0deNinja

+0

如果你不確定if語句在做什麼,你可能想要在不同的道場訓練。 (哈哈我小子我的孩子) 「國家」變量可以有不同的通訊狀態適用於它。 Lu Lu唯一關心的是它是否被打開(它也可以被創建) – feathj

+0

'如果'm_Service!= null',ConnectionIsOpen()總是返回true,可能是創建m_Service時刻時的問題處於連接狀態 – Damith

回答

0

,你是在Windows 7上得到完全不同的結果,這一事實並不奇怪。微軟用windows vista完全重新設計了TCP堆棧,所以它的功能與核心網絡功能中的xp完全不同。

,我會做的第一件事是使用Wireshark看到什麼是跨線實際去。查看您的TCP連接是否在您拔出插頭時實際終止。如果連接快速恢復,Windows可能會做某種連接持久性/緩衝。

2

我們碰到了我們自己的系統類似的問題;斷開網絡電纜或將客戶機或服務器置於睡眠模式不會產生通道故障。

從我可以告訴,似乎連接狀態僅指示最後一次通話後的連接,而不是當前連接狀態的狀態。知道當前狀態的唯一方法是實際調用服務。

如果您的客戶端不需要調用如果連接丟失一個解決方案,但往往必須作出反應的服務是實現客戶端上的哪些定期輪詢服務僞呼叫。如果在進行虛擬呼叫時連接不可用,您將遇到可以處理的通道故障。

美中不足的是,你不能簡單地用啞呼叫保證該服務的下一次調用將工作:

public void SomeMethode() 
{ 
    if (ConnectionIsOpen()) 
    { 
     m_Service.Dummy(); 
     // Connection is lost here 
     m_Service.SomeMethode(); 
    } 
} 

爲了解決這個問題,我們實現了一個系統,該系統會自動重新執行任何在連接恢復後會產生通道故障的服務呼叫失敗。

4

這將永遠是true

(m_Service.State | CommunicationState.Opened) == CommunicationState.Opened

例,m_Service.State = 0:

0 | CommuncationState.Opened == CommuncationState.Opened

你想用&(AND)來代替。