預設 IIS 寄宿採用「ASP.NET 並行模式」,WCF 管道在 PostAuthenticateRequest 即攔截請求,HttpContext.Current 永遠為 null,無法使用 ASP.NET Session。啟用 ASP.NET 相容模式,讓 .svc 請求完整走完 ASP.NET 管道(由 HttpHandler 處理),即可借用 HttpContext.Session 實現有狀態服務。
| 特性 | 並行模式 (預設) | 相容模式 |
|---|---|---|
| 處理管道 | HttpModule (PostAuthenticateRequest 截斷) | HttpHandler (完整生命週期) |
| HttpContext | null | 可用 |
| Session 支援 | 不可用 | 可用 |
| URL 授權 | 失效 | 生效 |
| 身分模擬 | 失效 | 生效 |
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]<serviceHostingEnvironment aspNetCompatibilityEnabled="true" /><wsHttpBinding> <binding allowCookies="true" /> </wsHttpBinding>[ServiceContract]
public interface ICalculator
{
[OperationContract] void Add(double x);
[OperationContract] void Subtract(double x);
[OperationContract] void Multiply(double x);
[OperationContract] void Divide(double x);
[OperationContract] double GetResult();
}
[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)]
public class CalculatorService : ICalculator
{
private const string Key = "__Result";
private double CurrentResult
{
get => HttpContext.Current.Session[Key] as double? ?? 0;
set => HttpContext.Current.Session[Key] = value;
}
public void Add(double x) => CurrentResult += x;
public void Subtract(double x) => CurrentResult -= x;
public void Multiply(double x) => CurrentResult *= x;
public void Divide(double x) => CurrentResult /= x;
public double GetResult() => CurrentResult;
}
<endpoint address="..." binding="wsHttpBinding"
bindingConfiguration="CookieBinding" contract="ICalculator" />
<bindings>
<wsHttpBinding>
<binding name="CookieBinding" allowCookies="true" />
</wsHttpBinding>
</bindings>
原理:ASP.NET Session 依賴 Cookie 傳遞 SessionId。WCF 預設不傳送/接收 Cookie,設定 allowCookies="true" 後,客戶端自動攜帶並儲存伺服器回傳的 Cookie,維持會話關聯。
初始值:0
Add(3) → 3
Multiply(10) → 30
Subtract(2) → 28
完美展示跨呼叫保留狀態。
ASP.NET 相容模式 + allowCookies 讓 WCF 在 IIS 中輕鬆獲得 Session 能力,適合移植既有 ASP.NET 應用、需共享 Session 的混合架構。但需注意:此模式綁定 HTTP/IIS,失去 WCF 多傳輸協定的優勢。