每個 ASP.NET 請求在 IIS 中的旅程,是一場精密的接力賽。本文結合 IIS 6.0/7.x 經典架構,通過 10 張核心流程圖,將請求從網卡驅動到 .NET 管道的完整鏈路拆解得清晰可見——適合面試突擊、架構設計、疑難雜症排查時作為「心中地圖」。
| 角色 | 進程/組件 | 核心職責 |
|---|---|---|
| HTTP.sys | 內核模式驅動 | 接收原始 HTTP 請求,按 URL 前綴路由到應用程序池隊列 |
| WAS (Windows Process Activation Service) | 用戶模式服務 | 從 HTTP.sys 取請求,啟動/管理 w3wp.exe,加載 ISAPI |
| w3wp.exe (工作進程) | 用戶模式進程 | 加載 CLR、ASP.NET 運行時、ISAPI 擴展,實際執行代碼 |
| aspnet_isapi.dll | ISAPI 擴展 | 非託管/託管邊界,將請求從 IIS 傳遞給 ASP.NET 管道 |
| HttpRuntime | 託管類 | 應用程序入口,創建 HttpContext、HttpApplication、啟動管道 |
| HttpModule | 託管類 (IHttpModule) | 管道中攔截器:認證、授權、Session、緩存、重寫、日誌... |
| HttpHandler | 託管類 (IHttpHandler) | 管道終點:根據副檔名/路由生成響應內容 (.aspx → PageHandlerFactory) |
HttpContext.Current 可全局訪問HttpHandlerFactory 根據副檔名/路由創建 Handler (如 PageHandlerFactory 處理 .aspx)https://*:80/app1/)# 經典問題:先裝 .NET 再裝 IIS → ISAPI 未註冊 → .aspx 返回 404/源碼 # 修復命令 (管理員 CMD): %windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i # 或 .NET Core/5+ 無需 ISAPI,使用 ASP.NET Core Module (ANCM)
IHttpModule,在 web.config <system.webServer/modules> 註冊IHttpHandler,在 <handlers> 映射副檔名/動詞aspnet_isapi.dll,改用 ANCM (aspnetcorev2_inprocess.dll / aspnetcorev2_outofprocess.dll)Startup.Configure() 構建管道| 現象 | 疑似階段 | 排查動作 |
|---|---|---|
| 瀏覽器無響應/連接重置 | HTTP.sys / 網絡 | netsh http show servicestate / Wireshark 抓包 |
| 503 Service Unavailable | WAS / 應用程序池啟動失敗 | 事件查看器 → System/Application → WAS/IIS 事件 |
| 404 .aspx / 顯示源碼 | ISAPI 映射缺失 | aspnet_regiis -i / IIS 處理程序映射檢查 |
| Session 丟失 / 認證失效 | HttpModule (Session/FormsAuth) | web.config |
| 自定義 Handler 不生效 | Handler 映射/順序 | IIS 功能視圖 → 處理程序映射 → 順序調整 |
IIS 處理 ASP.NET 請求是 **「內核路由 (HTTP.sys) → 進程激活 (WAS) → 非託管橋接 (ISAPI/ANCM) → 託管管道 (HttpRuntime → Module → Handler)」** 的四階段接力。理解這條鏈路的每個節點、每個組件的職責與邊界,是從「會用 IIS」進階到「駕馭 IIS」的必修內功。下次遇到詭異的 500/503/404/Session 失效,合上搜索引擎,在心中走一遍這條鏈路——答案往往就在節點交接處。