2009-09-09 162 views
24

我們正在使用WCF服務關閉WCF連接

在客戶端,我們正計劃明確地關閉連接 似乎有關閉

樣本1的多,其中一個方法: 在finally塊WCF服務消費使用

if (client.State == CommunicationState.Faulted) 
{ 
    client.Abort(); 
} 
client.Close(); 

,因爲如果服務處於故障狀態,我們將無法調用close()

樣品2:

using(ClientProxy proxy = new ClientProxy()) 
{ 
    //call your service methods 
} 

在SAMPLE2我不知道,如果服務處於故障狀態會發生什麼,它會拋出錯誤關閉連接?

+0

@ Balaji-看看這後http://stackoverflow.com/questions/573872/what-is-the-best-workaround- for-the-wcf-client-using-block-issue。這是最有幫助的 – RichardOD 2009-09-18 10:11:48

回答

16

使用「使用」塊的第二個示例不正確。 using塊確保在代理對象上調用Dispose方法。 Dispose方法依次調用Close方法,它將嘗試連接到通信狀態出錯時將引發異常的服務。所以你的感受/預感是絕對正確的。如果代理Dispose方法從第一個樣品使用的代碼,但它並沒有那麼不使用using塊:)

34

你手頭所有必要的信息 - 生成的最佳實踐使用和妥善關閉/中止所有的WCF客戶端代理是:

YourClientProxy clientProxy = new YourClientProxy(); 

try 
{ 
    .. use your service 
    clientProxy.Close(); 
} 
catch(FaultException) 
{ 
    clientProxy.Abort(); 
} 
catch(CommunicationException) 
{ 
    clientProxy.Abort(); 
} 
catch (TimeoutException) 
{ 
    clientProxy.Abort(); 
} 

捕獲FaultException處理服務響應時出現錯誤情況(因此您的通道處於故障狀態)的所有情況,並且CommunicationException將處理所有可能發生的與通信有關的所有其他異常,例如網絡連接中斷等。

使用using()塊的方法將不起作用,因爲如果塊的末尾發生異常,而Dispose()方法在客戶端代理上調用Close()方法時,則無法捕捉和處理。

+0

感謝所有的答覆。 我希望在web.config文件中有一些設置來處理連接關閉! – Balaji 2009-09-09 15:35:48

+1

FaultException是CommunicationException,所以在技術上你不需要兩個catch子句(除非你打算以不同的方式處理兩個case)。 – bobbymcr 2009-09-09 20:29:36

+0

FaultException是CommunicationException的後裔,你是對的 - 只要處理CommunicationException就可以了,只要你不需要爲兩種不同的情況做不同的事情。猜猜這只是我的一個習慣,即使我沒有對它們中的任何一個做任何特殊的事情,也可以單獨列出最常見的異常類型..... – 2009-09-09 20:34:11

4

在朱瓦爾·洛的優秀Programming WCF book他建議:

try 
{ 
    ClientProxy clientProxy = new ClientProxy(); 
    clientProxy.SomeMethod(); 
    clientProxy.Close(); 
} 
catch 
{ 
    proxy.Abort(); 
} 
+2

哈..我在書中看到了這段代碼,但我認爲它不能編譯。該服務必須在try塊之外進行聲明,以便在catch塊中進行訪問......然後您可能希望對其進行空檢查。 – foson 2011-04-01 20:25:12

+0

@ foson-你知道它在哪個頁面嗎?你對上述代碼是正確的。我有這本書,但現在讀了一段時間。 – RichardOD 2012-01-31 20:04:09