IIS 7 引入 WAS (Windows Process Activation Service) 和集成管道模式,請求處理流程與 IIS 6 截然不同。本文通過 8 步驟流程圖、經典 vs 集成模式架構對比、W3WP 進程內部處理邏輯,完整還原請求從網卡到托管代碼的全鏈路。
步驟 1-6:應用啟動 (首次請求/應用池啟動時) 步驟 7-8:常規請求處理 (後續請求直接進入)
| 步驟 | 組件 | 動作 |
|---|---|---|
| 1 | HTTP.sys (內核) | 攔截客戶端 HTTP 請求,放入內核隊列 |
| 2 | HTTP.sys → WAS | 通知 WAS 有新請求,WAS 讀取配置存儲 |
| 3 | WAS | 從 `applicationHost.config` 讀取站點/應用程序池配置 |
| 4 | WWW 服務 (W3SVC) | 根據配置設置 HTTP.sys 處理策略 (隊列綁定、限流等) |
| 5 | WWW 服務 | 配置 HTTP.sys 路由規則 |
| 6 | WAS | 啟動對應應用程序池的 Worker Process (w3wp.exe) |
| 7 | w3wp.exe | 處理請求並返回響應給 HTTP.sys |
| 8 | HTTP.sys → 客戶端 | 發送響應數據 |
請求 → HTTP.sys → w3wp.exe
→ 加載 aspnet_isapi.dll (ISAPI Extension)
→ ISAPI 創建 HttpRuntime → HttpApplication → 托管管道
→ 處理 .aspx/.asmx 等映射擴展名
→ 其他靜態文件由 IIS 原生模塊處理
特點:ASP.NET 作為 ISAPI 外掛,**僅處理映射擴展名**,靜態文件、ASP、PHP 走 IIS 原生路徑,**兩套管道並行**,認證/授權/緩存重複實現。
請求 → HTTP.sys → w3wp.exe
→ 直接進入托管管道 (無 ISAPI 跳轉)
→ HttpRuntime → HttpApplication → 統一 HTTP 管道
→ 所有請求 (靜態/動態/ASP/PHP) 統一經過托管模塊
→ 模塊:StaticFileModule、FormsAuthentication、Session、OutputCache、UrlRewrite...
特點:ASP.NET 模塊成為 IIS 管道**有機組成部分**,**單一管道**處理所有請求,托管代碼可攔截靜態文件、ASP、PHP 請求,實現統一認證、URL 重寫、輸出緩存。
[IIS 原生管道] ←→ [ISAPI: aspnet_isapi.dll] ←→ [ASP.NET 管道] 靜態文件 .aspx/.ashx Page/Handler ASP/PHP Module/Handler
[統一 IIS 管道] → [托管模塊: StaticFile, Auth, Session, Cache, Custom...]
→ [Handler: Page, MvcHandler, WebApi, StaticFile...]
所有請求統一流經,模塊順序由 system.webServer/modules 定義
| 維度 | 經典模式 | 集成模式 |
|---|---|---|
| 管道數量 | 雙管道 (IIS + ASP.NET) | 單管道 (統一) |
| ASP.NET 角色 | ISAPI Extension (外掛) | 原生模塊 (內建) |
| 靜態文件處理 | 僅 IIS 原生模塊 | 經過托管模塊 (可攔截) |
| 認證/授權 | 雙重配置 | 統一托管模塊 |
| web.config 節點 | ` | ` |
| 性能 | ISAPI 切換開銷 | 零切換、管道融合 |
| 兼容性 | 舊應用零修改 | 需遷移配置節點 |
遷移工具:`%windir%\system32\inetsrv\appcmd.exe migrate config "站點名/"`
IIS 7 重構請求處理核心:WAS 管理進程、HTTP.sys 內核路由、集成管道融合托管與原生模塊。**集成模式是現代標準**,提供統一攔截、更高性能、更簡潔配置。遷移舊應用時,重點遷移 `