ASP.NET 執行於多進程、多執行緒環境,理解其架構對正確處理靜態變數、Session 狀態、跨進程物件至關重要。

| 元件 | 說明 |
|---|---|
| w3wp.exe (Worker Process) | IIS 工作進程,裝載 ASP.NET 執行階段。每個應用程式集區對應一個或多個 w3wp。 |
| AppDomain | .NET 邊界,隔離靜態變數、型別載入、安全性。一個 w3wp 可含多個 AppDomain。 |
| HttpRuntime | 每個 AppDomain 一個,管理請求佇列、快取、配置讀取。 |
| ThreadPool | CLR 執行緒池,ASP.NET 借用執行緒處理請求,完成後歸還。 |
public static int Counter = 0; // 每個 w3wp/AppDomain 獨立一份!
解決:用資料庫、Redis、AppFabric Cache 等外部分散式儲存。
InProc:進程內,效能最好但不支援 Web Farm、回收失效。StateServer:獨立進程,跨 w3wp 共享,需序列化。SQLServer:資料庫儲存,最穩健支援叢集。Custom:Redis、MongoDB 等。放入 Session 的物件在 StateServer/SQLServer 模式下**必須可序列化**(標記 [Serializable])。
Application.Lock();
Application["Key"] = value; // 不會同步到其他 w3wp/AppDomain
Application.UnLock();
跨進程共享資料請改用分散式快取或資料庫。
lock 保護執行緒安全,跨進程用分散式鎖。