WCF Session 將相關訊息交換歸入同一 Conversation,以 SessionId 識別。與 ASP.NET Session 差異巨大:
| 特性 | WCF Session | ASP.NET Session |
|---|---|---|
| 初始化發起方 | Client (Proxy 建立/呼叫) | Server |
| 狀態儲存 | 不儲存狀態資料,靠 Instance Context 綁定 | Server 端 (InProc/StateServer/SQL) |
| 訊息順序保證 | 是 | 否 |
| 終止方式 | Proxy.Close() 或標註 IsTerminating Operation | Timeout / Abandon |
三種模式對應不同的 Proxy-Service Instance 對應關係:
[ServiceContract]
public interface ICalculator
{
[OperationContract(IsOneWay=true)] void Adds(double x);
[OperationContract] double GetResult();
}
public class CalculatorService : ICalculator
{
private double _result;
public CalculatorService() => Console.WriteLine("Instance Created");
~CalculatorService() => Console.WriteLine("Instance Destroyed");
public void Adds(double x) { _result += x; Console.WriteLine($"Session: {OperationContext.Current.SessionId}"); }
public double GetResult() => _result;
}
兩次 Proxy 呼叫 Adds(1), Adds(2) 結果皆為 0。Host 輸出顯示每呼叫建立/銷毀一次 Instance,SessionId 為 null。

Proxy1 累加 1+2=3,Proxy2 另起爐灶 1+2=3。Host 只建立兩個 Instance,無解構輸出 (Proxy 未 Close)。

(proxy as ICommunicationObject).Close(); // 觸發解構子
Host 出現 "Instance Destroyed" 輸出。
即使 Binding 支援 Session,結果同 basicHttpBinding。
[OperationContract(IsInitiating=true, IsTerminating=false)] void Adds(double x);
[OperationContract(IsInitiating=false, IsTerminating=true)] double GetResult();
呼叫 GetResult() 後 Session 終止,同一 Proxy 再呼叫 Adds() 拋出例外。
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]:即使 Contract 允許 Session,行為仍為 PerCall。InstanceContextMode.Single:Host 啟動即建立 Instance,所有 Proxy 共享狀態 (Proxy2 結果為 6)。

ConcurrencyMode) 設定。IsInitiating/IsTerminating。