2009-08-06 34 views
14

我有一個客戶端應用程序每隔10秒嘗試通過WCF Web服務發送消息。這個客戶端應用程序將在一艘船上的計算機上,我們知道這個程序將具有不明確的互聯網連接。我希望應用程序嘗試通過服務發送數據,如果不能,則會將消息排隊,直到它可以通過服務發送它們。從WCF中的CommunicationObjectFaultedException中恢復

爲了測試這個設置,我啓動了客戶端應用程序和web服務(都在我的本地機器上),並且一切正常。我嘗試通過殺死Web服務並重新啓動它來模擬糟糕的Internet連接。只要我殺了服務,我就開始收到CommunicationObjectFaultedExceptions - 這是預期的。但是在我重新啓動服務後,我仍然會遇到這些異常情況。

我敢肯定,有一些我不瞭解的Web服務範例,但我不知道那是什麼。任何人都可以提供關於這種設置是否可行的建議,如果有,如何解決這個問題(即重新建立與Web服務的通信通道)?

謝謝!一旦他們指責

克萊

回答

33

客戶服務代理不能重複使用。你必須處理舊的並重新創建一個。

您還必須確保正確關閉客戶端服務代理。 WCF服務代理可能在關閉時拋出異常,如果發生這種情況連接未關閉,則必須中止。使用「try {Close}/catch {Abort}」模式。另外請記住,dispose方法調用close(因此可以拋出dispose中的異常),所以不能像使用普通一次性類一樣使用它。

例如:

try 
{ 
    if (yourServiceProxy != null) 
    { 
     if (yourServiceProxy.State != CommunicationState.Faulted) 
     { 
      yourServiceProxy.Close(); 
     } 
     else 
     { 
      yourServiceProxy.Abort(); 
     } 
    } 
} 
catch (CommunicationException) 
{ 
    // Communication exceptions are normal when 
    // closing the connection. 
    yourServiceProxy.Abort(); 
} 
catch (TimeoutException) 
{ 
    // Timeout exceptions are normal when closing 
    // the connection. 
    yourServiceProxy.Abort(); 
} 
catch (Exception) 
{ 
    // Any other exception and you should 
    // abort the connection and rethrow to 
    // allow the exception to bubble upwards. 
    yourServiceProxy.Abort(); 
    throw; 
} 
finally 
{ 
    // This is just to stop you from trying to 
    // close it again (with the null check at the start). 
    // This may not be necessary depending on 
    // your architecture. 
    yourServiceProxy = null; 
} 

有關於這here

+0

+10一篇博客文章,如果我能 - 哇,這種行爲是完全在雷達之下,永遠都不會制定出了什麼事如果我沒有偶然發現這個答案。 – 2009-10-04 03:53:30

+0

Bravo!我實現了這個擴展方法的一個版本:TryDispose在代理類供別人使用。 – 2013-11-23 00:07:23

+0

@ Moby的特技雙 - 你能分享你的代碼嗎? – RichardHowells 2014-11-22 14:53:51