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

WCF 服務實例模式:PerCall、PerSession 與 Singleton 深度解析

     編輯:關於.NET

WCF 服務實例激活模式 (InstanceContextMode) 決定服務物件的生命週期、狀態保留與擴展性,對應 .NET Remoting 的 SingleCall、Client-Activated、Singleton。

三種模式對比

模式InstanceContextMode建立時機銷毀時機狀態保留擴展性類比 Remoting
PerCall (單次)PerCall每次呼叫呼叫結束無最佳SingleCall
PerSession (會話)PerSession用戶端建立 ProxySession 結束/關閉 Proxy會話期間中等Client-Activated
Singleton (單例)SingleHost 開啟時Host 關閉時全域共享最差 (單執行緒預設)Singleton

設定方式

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
public class PerCallService : IService { ... }

[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
public class PerSessionService : IService { ... }

[ServiceBehavior(InstanceContextMode = InstanceContextMode.Single)]
public class SingletonService : IService { ... }

關鍵行為差異示範

服務類內含計數器 _count,每次 SayHello() 遞增並輸出:

  • PerCall:每次呼叫輸出 1 (新實例)。
  • PerSession:同一 Proxy 多次呼叫輸出 1, 2, 3...;新 Proxy 重置為 1。
  • Singleton:所有 Proxy 共享計數,輸出 1, 2, 3, 4... 持續遞增。

進階控制:節流與釋放

  • [ServiceBehavior(InstanceContextMode = PerCall)] 搭配 IDisposable 釋放非託管資源 (DB 連線等)。
  • serviceThrottling 限制最大併發呼叫 (maxConcurrentCalls)、會話 (maxConcurrentSessions)、實例 (maxConcurrentInstances)。
  • PerSession 預設閒置 10 分鐘自動終止,可透過 <serviceBehaviors> 中 serviceTimeouts transactionTimeout 或程式碼調整 InactivityTimeout。

綁定與 Session 相容性

BindingSession 支援預設 InstanceContextMode
basicHttpBinding不支援 (No/Allowed)PerCall
wsHttpBinding (安全/可靠)支援 (Allowed/Required)PerSession
netTcpBinding / netNamedPipeBinding支援 (Allowed/Required)PerSession

注意:basicHttpBinding 無法維持 Session,強制 PerSession 會導致每次呼叫仍建立新實例。

選型建議

  • PerCall:無狀態、高擴展性、事務處理、佇列服務首選。
  • PerSession:需維護用戶端狀態 (購物車、精靈流程)、Duplex 回呼。
  • Singleton:極少見,僅適用單一共享資源 (如硬體裝置驅動、全域快取) 且併發極低。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved