2009-04-27 135 views
18

我已經將WCF服務的客戶端代理的實例放入App類的屬性中,以便我可以從應用程序的任何位置獲取它。什麼時候關閉WCF客戶端?

我不關閉客戶端,我要離開它打開的應用程序的持續時間。這樣做的主要原因是,如果我要遵循WCF服務mex頁面中的// Comment(如果您將瀏覽器指向WCF服務url),//它會說//始終關閉客戶端。 client.Close();

這是很好的,但如果我叫client.Close()之後我做出client.SomeAsync()的調用方法,然後它被結果回來之前關閉。我應該把close放進Completed()方法嗎?或者我應該忘記關閉它,因爲一旦它關閉,我必須創建一個客戶端代理的新實例(如果是這種情況,可能不會將其存儲在App.property中)。

謝謝, Stephen

回答

12

你應該關閉它的建議。是的,如果你使用的異步方法,那麼你必須關閉它在調用完成後進行。

創建(打開)和關閉客戶端是WCF常態客戶,沒有明顯的性能損失不斷創建和關閉的新客戶。

+0

請記得在關閉時添加try catch,因爲關閉會導致異常。 http://msdn.microsoft.com/en-us/library/ms405496.aspx。我使用它像這樣嘗試 client.Close(); } 捕獲 { client.Abort(); } – 2013-10-25 00:51:19

1

Ë最好在Completed方法的finally {}中隱式關閉它。無論什麼原因,如果客戶端保持連接狀態,您將開始阻止其他客戶端呼叫由於按照HTTP RFC:

於1999年(RFC 2616)定義的「客戶 使用永久連接的應該 限制同時 連接,他們維持到 給定服務器的數量。單用戶客戶端 不應該保持超過2個 連接任何服務器或代理。 ,代理人應當使用最多2個* N 連接到另一臺服務器或代理 ,其中N是 同時活動用戶的數量。這些 準則旨在提高 的HTTP響應時間並避免 擁塞。「由於開發人員使用AJAX或AJAX類似的請求到 更新網頁,因此http限制 的討論越來越多。

如果您沒有關閉連接,則有負載,您很可能會開始阻止。我當然認爲這是HttpBinding。