WCF 服務實例激活模式 (InstanceContextMode) 決定服務物件的生命週期、狀態保留與擴展性,對應 .NET Remoting 的 SingleCall、Client-Activated、Singleton。
| 模式 | InstanceContextMode | 建立時機 | 銷毀時機 | 狀態保留 | 擴展性 | 類比 Remoting |
|---|---|---|---|---|---|---|
| PerCall (單次) | PerCall | 每次呼叫 | 呼叫結束 | 無 | 最佳 | SingleCall |
| PerSession (會話) | PerSession | 用戶端建立 Proxy | Session 結束/關閉 Proxy | 會話期間 | 中等 | Client-Activated |
| Singleton (單例) | Single | Host 開啟時 | 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() 遞增並輸出:
[ServiceBehavior(InstanceContextMode = PerCall)] 搭配 IDisposable 釋放非託管資源 (DB 連線等)。serviceThrottling 限制最大併發呼叫 (maxConcurrentCalls)、會話 (maxConcurrentSessions)、實例 (maxConcurrentInstances)。<serviceBehaviors> 中 serviceTimeouts transactionTimeout 或程式碼調整 InactivityTimeout。| Binding | Session 支援 | 預設 InstanceContextMode |
|---|---|---|
| basicHttpBinding | 不支援 (No/Allowed) | PerCall |
| wsHttpBinding (安全/可靠) | 支援 (Allowed/Required) | PerSession |
| netTcpBinding / netNamedPipeBinding | 支援 (Allowed/Required) | PerSession |
注意:basicHttpBinding 無法維持 Session,強制 PerSession 會導致每次呼叫仍建立新實例。