2011-05-05 32 views
20

我試圖更好地理解當我使用WCF代理時發生了什麼。我無法理解關閉(或不關閉)代理時發生的情況。當我關閉/中止WCF頻道/代理時會發生什麼?

  • 當我在WCF代理上調用Close()或Abort()時發生了什麼?有什麼不同?
  • 它在不同的綁定類型之間有什麼區別(比如,一個無會話的BasicHttpBinding和某些會話)?
  • 爲什麼Close()會在某些情況下拋出,爲什麼它可能是阻塞操作?
+0

很多被寫了關於這個問題,開始看: http://stackoverflow.com/questions/2440608/wcf-service-client-lifetime – 2011-08-31 14:53:15

回答

19

關閉WCF客戶端
一個客戶的正常關閉連接繼承的責任。總是建議關閉代理客戶端。如果客戶端和服務之間的綁定是傳輸層會話,那麼關閉代理對於拆除雙方之間的連接至關重要。服務具有爲併發連接定義的有效負載閾值。如果併發連接的數量線性地高於此閾值,則整體服務性能以指數規律地減少。這就是爲什麼儘快處理連接至關重要。關閉代理服務器還會通知服務實例它不再被使用,並可能被GC收集(服務實例管理服務)。如果客戶端沒有關閉連接,它仍然會被WCF超時(在配置文件中找到)自動關閉。

中止WCF客戶端
在存在在服務客戶端交互的故障的情況下,兩端的對象都是潛在的完全破碎。因此在不建議異常之後使用代理。鑑於WCF綁定使用傳輸會話,故障後的客戶端甚至無法關閉它(如果沒有傳輸層會話,則客戶端可以使用或關閉代理,但不建議這樣做,因爲會話配置可能會更改)。所以在發生故障之後,唯一安全的操作是中止代理。

Close是一個同步操作,它可以在傳輸會話已被故障損壞時拋出,並且在接收到來自服務的確認響應之前它是阻塞操作(某些綁定爲true)。

+2

如果併發連接數超過這個門檻'線性則整體服務表現呈指數級下降。「您能否幫助理解這一點。 – Abhijeet 2013-03-08 12:27:38

+1

這只是我在實踐中觀察到的 - 負載和資源通常以這種方式表現。如果增加負載,則吞吐量性能會增加。然而,在某個點(飽和點),負載會像盒子通常可以處理的那樣高。此時你可以獲得最高性能。如果持續增加負載,服務不會立即死亡,但會「緩衝」請求。這有助於解決挑剔負載流量,因爲它通常持續很少的時間。但在我們的例子中,我們將繼續增加負載並填充一些內部緩衝區。飽和後perf性能下降得快得多。 – oleksii 2015-11-09 17:16:22

相關問題