首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WCF 技術深度剖析(九):服務代理未及時關閉的後果與併發會話限制

     編輯:關於.NET

前言:為什麼必須關閉服務代理?

許多開發者知道要關閉代理,但不清楚不關閉的具體後果。本文透過實驗揭示:會話通道受限於服務端並發會話配額(預設 10),未關閉代理會耗盡配額導致後續調用超時。

一、兩種通道類型的差異

  • 會話通道:訊息有序、相關,支援狀態維護。錯誤會影響後續交換。BasicHttpBinding 除外,預設綁定皆建立會話通道。
  • 資料報通道:無狀態、獨立交換,錯誤不影響後續。無並發會話限制。

二、實驗:未關閉代理導致超時

客戶端迴圈建立 20 次代理調用 Add(1,2),不呼叫 Close():

for (int i=1; i<=20; i++) {
    var proxy = factory.CreateChannel();
    Console.WriteLine($"{i}: {proxy.Add(1,2)}");
    // 未關閉!
}

結果:前 11 次成功,第 12 次拋出 TimeoutException(預設 1 分鐘)。原因:服務端 ServiceThrottlingBehavior.MaxConcurrentSessions = 10,加上通道監聽器額外允許 1 個 = 11。

三、解決方案:提高配額或及時關閉

方案 A:調整服務端配額(配置檔)

<serviceThrottling maxConcurrentSessions="100" />

方案 B:客戶端及時關閉代理(推薦)

for (int i=1; i<=2000; i++) {
    var proxy = factory.CreateChannel();
    Console.WriteLine($"{i}: {proxy.Add(1,2)}");
    (proxy as ICommunicationObject).Close(); // 釋放會話
}

結果:2000 次全數成功,無超時。

四、資料報通道無此限制

將 WSHttpBinding 設為 SecurityMode.None(或使用 BasicHttpBinding),建立資料報通道。同樣迴圈 2000 次不關閉代理,全部成功。驗證:MaxConcurrentSessions 僅限會話通道。

核心結論

  • 會話通道 = 有限資源,必須歸還(Close)。
  • 資料報通道 = 無狀態,關閉與否無關緊要。
  • 高併發場景下,客戶端務必確保每次調用後關閉代理,否則極易觸發服務端節流導致大面積超時。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved