Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> 電腦軟體教學 >> 伺服器技術 >> 關於伺服器

IIS 處理 ASP.NET 請求全流程深度圖解:從 HTTP.sys 到 HttpHandler 的完整鏈路

編輯:關於伺服器

每個 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.dllISAPI 擴展非託管/託管邊界,將請求從 IIS 傳遞給 ASP.NET 管道
HttpRuntime託管類應用程序入口,創建 HttpContext、HttpApplication、啟動管道
HttpModule託管類 (IHttpModule)管道中攔截器:認證、授權、Session、緩存、重寫、日誌...
HttpHandler託管類 (IHttpHandler)管道終點:根據副檔名/路由生成響應內容 (.aspx → PageHandlerFactory)

完整 10 步流程圖解

  1. 客戶端發起請求 → 網卡 → TCP/IP 協議棧 → HTTP.sys (內核)
  2. HTTP.sys 解析 URL 前綴 → 查詢內部註冊表 → 確定目標 應用程序池隊列 (每個池註冊唯一 URL 前綴)
  3. WAS (用戶模式) 從隊列取請求 → 檢查池狀態 → 必要時啟動 w3wp.exe
  4. w3wp.exe 啟動 → 加載 CLR (mscoree.dll) → 加載 aspnet_isapi.dll (ISAPI 映射 .aspx 等)
  5. ISAPI 擴展 調用 HttpRuntime.ProcessRequest() → 進入託管世界
  6. HttpRuntime 創建 HttpContext (封裝 Request/Response/Session/Cache/User...) → HttpContext.Current 可全局訪問
  7. HttpApplicationFactory 獲取/創建 HttpApplication 實例 (池化復用) → 掛載配置好的 HttpModule 集合
  8. 請求進入 Http 管道 → 依次經過 20+ 個 HttpModule (BeginRequest → Authenticate → Authorize → ResolveRequestCache → AcquireRequestState → PreRequestHandlerExecute...)
  9. 路由到 HttpHandler → HttpHandlerFactory 根據副檔名/路由創建 Handler (如 PageHandlerFactory 處理 .aspx)
  10. HttpHandler.ProcessRequest() 執行頁面生命周期 → 生成 HTML → 寫入 Response → 返回管道 → EndRequest Modules → 發送給 HTTP.sys → 客戶端

關鍵技術細節

HTTP.sys URL 註冊機制

  • 每個應用程序池啟動時,WAS 向 HTTP.sys 註冊其綁定的 URL 前綴 (如 https://*:80/app1/)
  • HTTP.sys 內核級路由,**無上下文切換開銷**,極高性能
  • 支援多池共享端口 (Port Sharing),避免端口耗盡

ISAPI 註冊陷阱

# 經典問題:先裝 .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)

HttpModule vs HttpHandler

  • Module (管道中間件):可攔截、修改、短路請求,**多個串聯執行** (如認證、壓縮、重寫)
  • Handler (終點):**僅有一個**執行,負責生成最終響應 (如 .aspx、.ashx、.asmx、靜態文件)
  • 自定義 Module:實現 IHttpModule,在 web.config <system.webServer/modules> 註冊
  • 自定義 Handler:實現 IHttpHandler,在 <handlers> 映射副檔名/動詞

ASP.NET Core 時代的變化 (IIS 7.5+ / ANCM)

  • 不再依賴 aspnet_isapi.dll,改用 ANCM (aspnetcorev2_inprocess.dll / aspnetcorev2_outofprocess.dll)
  • 請求流向:HTTP.sys → WAS → w3wp.exe → ANCM → Kestrel (進程內) 或 反向代理到 Kestrel (進程外)
  • 管道簡化:Middleware 取代 Module/Handler,Startup.Configure() 構建管道

故障排查地圖:按階段定位

現象疑似階段排查動作
瀏覽器無響應/連接重置HTTP.sys / 網絡netsh http show servicestate / Wireshark 抓包
503 Service UnavailableWAS / 應用程序池啟動失敗事件查看器 → 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 失效,合上搜索引擎,在心中走一遍這條鏈路——答案往往就在節點交接處。

Copyright © Windows教程網 All Rights Reserved