首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> ASP.NET 基礎

VS 偵錯正常、IIS 部署報錯:權限、連線字串、應用程式池完整排查指南

     編輯:ASP.NET 基礎

核心差異:開發伺服器 vs IIS

維度VS 內建伺服器 (IIS Express / Cassini)正式 IIS
執行身分當前登入使用者 (通常為管理員)應用程式池身分 (`ApplicationPoolIdentity` / `NetworkService` / 自訂帳號)
權限範圍使用者擁有的所有權限受限於 IIS_IUSRS、NTFS ACL、資料庫登入權限
基底路徑專案目錄虛擬目錄/網站實體路徑 (可能不同)
設定繼承Web.config 單一生效受 `applicationHost.config`、機器層 `web.config` 多層繼承影響

高頻問題與解決方案

1. 資料庫連線失敗 (最常見)

// 現象:SqlException: Cannot open database "DbLog" requested by the login. The login failed.
// 原因:IIS 執行身分無資料庫權限

解決步驟:

  1. **確認連線字串**:`Integrated Security=True` 表示使用 Windows 整合驗證,登入帳號為 IIS 執行身分。
  2. **識別 IIS 執行身分**:
    • IIS 7+:應用程式池 → 進階設定 → `Identity` (預設 `ApplicationPoolIdentity`,對應虛擬帳號 `IIS APPPOOL\PoolName`)。
    • 舊版/自訂:`NetworkService` (機器帳號 `DOMAIN\MACHINE$`) 或自訂網域帳號。
  3. **在 SQL Server 建立登入並授權**:
    -- SSMS 執行
    CREATE LOGIN [IIS APPPOOL\MyAppPool] FROM WINDOWS;
    ALTER SERVER ROLE [dbcreator] ADD MEMBER [IIS APPPOOL\MyAppPool]; -- 視需求
    USE [DbLog];
    CREATE USER [IIS APPPOOL\MyAppPool] FOR LOGIN [IIS APPPOOL\MyAppPool];
    ALTER ROLE [db_datareader] ADD MEMBER [IIS APPPOOL\MyAppPool];
    ALTER ROLE [db_datawriter] ADD MEMBER [IIS APPPOOL\MyAppPool];
    -- 或給予 db_owner (僅開發環境)
    
  4. **啟用 SQL Server 遠端連線 / TCP/IP / 防火牆 1433** (若跨機器)。

2. 檔案/資料夾存取被拒 (UnauthorizedAccessException)

現象:上傳儲存、日誌寫入、模板讀取失敗。

解決:給予 IIS 執行身分 **NTFS 修改權限** (讀寫、建立檔案/資料夾)。

// PowerShell 範例 (以 ApplicationPoolIdentity 為例)
$acl = Get-Acl "D:\WebApps\MySite\App_Data"
$rule = New-Object System.Security.AccessControl.FileSystemAccessRule(
    "IIS APPPOOL\MyAppPool", "Modify", "ContainerInherit,ObjectInherit", "None", "Allow")
$acl.AddAccessRule($rule)
Set-Acl "D:\WebApps\MySite\App_Data" $acl

**關鍵目錄**:`App_Data`、上傳目錄、日誌目錄、臨時編譯目錄 (`Temporary ASP.NET Files`)。

3. 靜態檔案 404 / 副檔名對應缺失

現象:`.woff`、`.json`、`.map`、`.svg` 返回 404。

解決:在 `Web.config` 註冊 MIME 對應:

<system.webServer>
  <staticContent>
    <remove fileExtension=".woff" />
    <mimeMap fileExtension=".woff" mimeType="font/woff" />
    <remove fileExtension=".json" />
    <mimeMap fileExtension=".json" mimeType="application/json" />
  </staticContent>
</system.webServer>

4. 預設文件 / 目錄瀏覽 / 路由 404

  • 確認 `default.aspx` / `index.html` 在預設文件清單。
  • MVC/WebAPI 路由需 `runAllManagedModulesForAllRequests="true"` 或安裝 `Microsoft.AspNet.Mvc` 套件自動註冊 `UrlRoutingModule`。
  • 檢查 `system.webServer/modules` 是否移除 `UrlRoutingModule`。

5. 憑證/HTTPS/SSL 錯誤

  • IIS 憑證綁定:網站 → 繫結 → https → 選擇正確憑證 (需含私鑰)。
  • 應用程式池 `Load User Profile = True` (載入使用者設定檔),否則機器金鑰集合存取失敗 (加密/簽章功能報錯)。
  • 6. 32/64 位元不匹配

    • 應用程式池 → 進階設定 → `Enable 32-Bit Applications`:若引用 32 位元 COM/DLL (如舊版 Oracle Client、Crystal Reports) 需設 `True`;純 .NET 64 位元建議 `False` 以獲得更大記憶體空間。
    • 7. 設定鎖定/繼承衝突

      現象:Web.config 設定不生效、報錯 "This configuration section cannot be used at this path"。

      解決:在 `applicationHost.config` 解鎖區段,或在 Web.config 使用 `` 隔離子應用程式設定。

      診斷工具與技巧

      1. 失敗要求追蹤 (FREB):IIS → 網站 → 失敗要求追蹤 → 新增規則 (狀態碼 400-999) → 重現錯誤 → 分析 `Compact View` 完整管線事件。
      2. Process Monitor (ProcMon):篩選 `w3wp.exe`、`Access Denied`、`NAME NOT FOUND`,直觀定位檔案/註冊表/網路存取失敗。
      3. 事件檢視器:Windows Logs → Application / System,搜尋 `ASP.NET`、`IIS`、`W3SVC` 來源。
      4. 瀏覽器開發者工具 Network 面板:查看實際請求 URL、標頭、回應碼、回應內容。
      5. 遠端偵錯:VS → 偵錯 → 附加至處理序 → 連線遠端伺服器 `w3wp.exe`,打斷點逐步排查。

      部署檢查清單 (上線前必驗)

      [ ] 應用程式池 .NET 版本 / 管線模式 / Identity 正確
      [ ] 實體路徑指向正確發布輸出目錄 (含 bin、Views、web.config)
      [ ] NTFS 權限:IIS_IUSRS / AppPool Identity 對 App_Data、Logs、Uploads 有 Modify
      [ ] 連線字串:Integrated Security 對應正確 SQL 登入;或 SQL 驗證帳密正確
      [ ] SQL Server:遠端連線、防火牆、TCP/IP、命名管道 正確啟用
      [ ] Web.config:connectionStrings、appSettings、system.webServer 區段正確
      [ ] MIME 類型:靜態資源副檔名皆已註冊
      [ ] HTTPS:憑證綁定、Load User Profile=True、HSTS/SSL 重導向規則
      [ ] 記錄:ELM/Serilog/NLog 路徑可寫、日誌級別適當
      [ ] 錯誤頁面:customErrors / httpErrors 設定友善頁面、不洩露堆疊
      

      總結

      「VS 正常、IIS 掛掉」90% 是 **身分與權限差異** 造成。掌握 **應用程式池身分 → NTFS ACL → SQL 登入** 這條主線,配合 **FREB + ProcMon** 雙工具,可快速定位並解決絕大多數部署問題。建立標準化部署檢查清單,將「部署即上線」變為常態。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved