| 維度 | VS 內建伺服器 (IIS Express / Cassini) | 正式 IIS |
|---|---|---|
| 執行身分 | 當前登入使用者 (通常為管理員) | 應用程式池身分 (`ApplicationPoolIdentity` / `NetworkService` / 自訂帳號) |
| 權限範圍 | 使用者擁有的所有權限 | 受限於 IIS_IUSRS、NTFS ACL、資料庫登入權限 |
| 基底路徑 | 專案目錄 | 虛擬目錄/網站實體路徑 (可能不同) |
| 設定繼承 | Web.config 單一生效 | 受 `applicationHost.config`、機器層 `web.config` 多層繼承影響 |
// 現象:SqlException: Cannot open database "DbLog" requested by the login. The login failed.
// 原因:IIS 執行身分無資料庫權限
解決步驟:
-- 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 (僅開發環境)
現象:上傳儲存、日誌寫入、模板讀取失敗。
解決:給予 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`)。
現象:`.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>
現象:Web.config 設定不生效、報錯 "This configuration section cannot be used at this path"。
解決:在 `applicationHost.config` 解鎖區段,或在 Web.config 使用 `
[ ] 應用程式池 .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** 雙工具,可快速定位並解決絕大多數部署問題。建立標準化部署檢查清單,將「部署即上線」變為常態。