本文深入剖析 WCF 三大實例模式(PerCall、PerSession、Single)的生命週期、適用場景、注意事項,並以實戰範例驗證行為差異。適合具備 WCF 基礎概念的開發人員。
透過 [ServiceBehavior(InstanceContextMode = InstanceContextMode.XXX)] 設定:
| 模式 | 建立時機 | 銷毀時機 | 狀態保持 | 預設值 |
|---|---|---|---|---|
| PerCall | 每次操作呼叫 | 操作完成 | 無 | ✅ 是 |
| PerSession | 會話建立時 | 會話結束/逾時 | 有(會話範圍內) | 否 |
| Single | 服務啟動時 | 服務關閉時 | 有(全域單例) | 否 |

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

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

優點:無實例建立開銷、全域狀態共享(快取、連線池)。
致命風險:多執行緒並發存取共享欄位必須加鎖,否則數據競爭導致邏輯錯誤。
| 場景 | 推薦模式 | 理由 |
|---|---|---|
| 無狀態 API、高併發、短連線 | PerCall | 資源釋放及時,擴展性最佳 |
| 需維護用戶會話狀態、雙工通訊 | PerSession | 天然支援會話綁定與回調 |
| 全域單一資源(硬體裝置、授權伺服器、記憶體快取) | Single | 確保全進程唯一實例 |
| 長時間運算、獨佔資源 | PerCall 或 PerSession | 避免阻塞單例實例 |
IsTerminating=true 的操作會結束會話銷毀實例receiveTimeout、inactivityTimeout)會自動終結會話lock、ConcurrentDictionary、ReaderWriterLockSlim、ImmutableCollectionsLazy<T> 或 IExtension<ServiceHostBase> 延遲初始化ConcurrencyMode.Multiple/Reentrant 搭配提升併發範例定義三個服務分別採用三種模式,客戶端連續呼叫觀察實例建立/銷毀行為。

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


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