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

WCF 從理論到實踐 (9):實例模式與物件生命週期完全指南

     編輯:關於.NET

文章導讀

本文深入剖析 WCF 三大實例模式(PerCall、PerSession、Single)的生命週期、適用場景、注意事項,並以實戰範例驗證行為差異。適合具備 WCF 基礎概念的開發人員。

核心知識點

  • 三大實例模式定義與生命週期流程圖解
  • 各模式適用業務場景與資源管理策略
  • 關鍵注意事項:狀態維護、執行緒安全、會話綁定限制
  • 實戰範例驗證:服務端/客戶端運行效果對比

一、WCF 三大實例模式概覽

透過 [ServiceBehavior(InstanceContextMode = InstanceContextMode.XXX)] 設定:

模式建立時機銷毀時機狀態保持預設值
PerCall每次操作呼叫操作完成無✅ 是
PerSession會話建立時會話結束/逾時有(會話範圍內)否
Single服務啟動時服務關閉時有(全域單例)否

二、生命週期流程詳細解析

1. PerCall——快餐式,無狀態、高吞吐

PerCall 生命週期流程圖

  1. 客戶端建立 Proxy
  2. 呼叫操作 → 託管建立新服務實例
  3. 執行操作 → 回應 → 實例銷毀(若實作 IDisposable 呼叫 Dispose())

優點:資源即用即放,避免長連接佔用稀缺資源(DB 連線、檔案鎖、通訊埠),極大提升併發吞吐。
缺點:無法維護會話狀態,每次呼叫重新初始化非靜態欄位。

2. PerSession——傳統 C/S 模式,有狀態、需會話支援

PerSession 生命週期流程圖

  1. 客戶端建立 Proxy → 首次呼叫
  2. 託管建立服務實例,綁定該會話
  3. 後續呼叫複用同一實例,維護狀態
  4. 會話逾時或明確終止 → 實例銷毀

適用:需維護狀態(購物車、遊戲狀態)、雙工回調、跨網路建立連接成本高場景。
限制:需支援會話的繫結(WSHttpBinding、NetTcpBinding、NetNamedPipeBinding),BasicHttpBinding 不支援。

3. Single——單例模式,全域共享、極致效能但需執行緒安全

Single 生命週期流程圖

  1. 服務啟動 → 立即建立唯一實例
  2. 所有客戶端共享此實例處理請求
  3. 服務關閉 → 實例銷毀

優點:無實例建立開銷、全域狀態共享(快取、連線池)。
致命風險:多執行緒並發存取共享欄位必須加鎖,否則數據競爭導致邏輯錯誤。

三、各模式適用場景與選型指南

場景推薦模式理由
無狀態 API、高併發、短連線PerCall資源釋放及時,擴展性最佳
需維護用戶會話狀態、雙工通訊PerSession天然支援會話綁定與回調
全域單一資源(硬體裝置、授權伺服器、記憶體快取)Single確保全進程唯一實例
長時間運算、獨佔資源PerCall 或 PerSession避免阻塞單例實例

四、關鍵注意事項(避坑指南)

PerCall

  • 非靜態欄位每次呼叫重置,切勿依賴實例欄位保持狀態
  • 靜態欄位跨實例共享,需自行處理執行緒安全

PerSession

  • 繫結必須支援會話(查閱繫結對照表)
  • IsTerminating=true 的操作會結束會話銷毀實例
  • 閒置逾時(receiveTimeout、inactivityTimeout)會自動終結會話
  • 狀態不會「自動」維護,開發者需設計實例欄位儲存狀態

Single

  • 必須處理執行緒安全:lock、ConcurrentDictionary、ReaderWriterLockSlim、ImmutableCollections
  • 避免在實例建構子執行耗時初始化(阻塞服務啟動),改用 Lazy<T> 或 IExtension<ServiceHostBase> 延遲初始化
  • 考慮 ConcurrencyMode.Multiple/Reentrant 搭配提升併發

五、實戰範例驗證

範例定義三個服務分別採用三種模式,客戶端連續呼叫觀察實例建立/銷毀行為。

服務端運行效果

服務啟動時 Single 實例已建立

關鍵觀察:服務 ServiceHost.Open() 瞬間,Single 模式實例已建立(建構子執行)。

客戶端呼叫效果

客戶端呼叫序列

服務端後續效果

服務端實例行為記錄

驗證結果:PerCall 每次新建、PerSession 會話內複用、Single 全程單一實例。

參考資料

MSDN Magazine: WCF Instance Management

本文配套源碼下載
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved