ASP.NET 請求進入 IIS 管線後,工作進程 w3wp.exe (IIS 6.0 為 aspnet_wp.exe) 異常退出或無法啟動,導致應用程序池停止服務。典型事件日誌:Event ID 1000 / 1026 / 5000,伴隨 aspnet_wp.exe unexpectedly stopped。
現象**:先裝 .NET,後裝 IIS → ASP.NET ISAPI 映射未註冊。
解決**:重新註冊 ASP.NET:
# .NET Framework 2.0/3.5
%windir%\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -i -enable
# .NET Framework 4.x
%windir%\Microsoft.NET\Framework\v4.0.30319\aspnet_regiis.exe -i -enable
# 或 64 位
%windir%\Microsoft.NET\Framework64\v4.0.30319\aspnet_regiis.exe -i -enable
# IIS 7+ 還需啟用 ISAPI/CGI 限制
# IIS 管理器 → ISAPI 和 CGI 限制 → 找到 ASP.NET v4.0 → 允許
現象**:池標識為 NetworkService 或自定義用戶,無權讀取網站目錄、寫入臨時文件、訪問數據庫/註冊表。
解決**:
LocalSystem(高權限,僅排查用)。IIS_AppPool_User),授予網站目錄 Read/Execute、App_Data Modify、數據庫連接權限,池標識設為該賬號。IIS_IUSRS 組擁有網站根目錄讀取權限(ICACLS 命令批量授權)。現象**:站點 A 用 .NET 2.0,站點 B 用 .NET 4.0,卻共用同一池 → BadImageFormatException 或池頻繁回收。
解決**:強制按 .NET 版本拆分應用程序池。
# 建議命名規範
AppPool_Net20_Classic
AppPool_Net40_Integrated
AppPool_Net40_Classic # 兼容舊應用
站點「基本設置」→「應用程序池」選擇對應池。
現象**:安裝特定 Windows Update 後突發 ExecutionEngineException、aspnet_wp.exe crashed。
排查**:查看「安裝的更新」列表,近期安裝的 .NET 相關補丁逐個卸載驗證。
預防**:生產環境實施**補丁測試窗口**(預發先裝觀察 1 週),關鍵補丁納入變更管理流程。
| 工具 | 用途 | 關鍵命令 |
|---|---|---|
| Event Viewer | 查看 Application/System 日誌,Event ID 1000/1026/5000/5011 | eventvwr.msc |
| DebugDiag | 捕獲崩潰 Dump,分析堆疊、內存洩漏、死鎖 | 配置規則 → 捕獲 → 分析報告 |
| ProcMon (Sysinternals) | 實時監控文件/註冊表/網絡訪問,定位「拒絕訪問」 | Filter: Process Name = w3wp.exe, Result = ACCESS DENIED |
| Failed Request Tracing (FREB) | 記錄失敗請求完整管線流程(模塊、耗時、狀態碼) | IIS → 站點 → 失敗請求跟蹤 → 啟用 |
| ASP.NET 內置追蹤 | trace.axd 查看請求詳情、控制樹、Session/Application 狀態 | web.config: <trace enabled="true" pageOutput="false" /> |
aspnet_regiis -i 重新註冊(最快、無損)。ICACLS "C:\inetpub\wwwroot" /grant "IIS_IUSRS:(OI)(CI)RX" /T)。w3wp.exe 內存限制設置)。「服務器應用程序不可用」是癥狀而非病因。**90% 由註冊缺失、權限缺失、版本衝突、補丁副作用**引起。建立標準化部署腳本(含 aspnet_regiis、ACL 設置、池創建)、實施預發驗證、接入崩潰自動分析,可將故障 MTTR 從小時級壓縮至分鐘級。