將 ASP.NET 應用部署至 IIS(Windows Server / 阿里雲 Windows 主機)後,瀏覽器報錯:
存取被拒絕。執行 XmlSerializer 的身分識別 "IIS APPPOOL\YourAppPool" 沒有足夠權限存取暫存目錄。
CodeDom 將使用此程序用於編譯的使用者帳戶,因此如果使用者對系統暫存目錄沒有存取權限,則將無法編譯。
CS0016: 無法寫入輸出檔案 “c:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files\...\App_global.asax.xxx.dll” -- “拒絕存取。”
App_global.asax、Razor 視圖、Web Forms 頁面)。ApplicationPoolIdentity,顯示為 IIS APPPOOL\PoolName)必須擁有該目錄的讀寫權限。C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files 加權限常因繼承中斷、多層級目錄導致失效。iisreset)。
Load User Profile = true 會讓 Worker Process (w3wp.exe) 載入該身分識別的完整使用者設定檔,包含 %TEMP%、%TMP% 環境變數指向的使用者專屬暫存目錄(通常在 C:\Users\\AppData\Local\Temp )。Temporary ASP.NET Files,權限問題自然解決。HKEY_CURRENT_USER、COM 元件啟動)。| 方案 | 操作 | 缺點 |
|---|---|---|
| 手動授權系統暫存目錄 | 對 IIS APPPOOL\PoolName 給 Temporary ASP.NET Files 完整控制權 | 目錄層級深、繼承易斷、Windows 更新可能重置權限 |
| 自訂暫存目錄 | 在 web.config 設定 <compilation tempDirectory="D:\AspNetTemp" /> 並授權 | 需額外維護目錄、磁碟空間、備份策略 |
| 改用具名服務帳戶 | 建立網域/本機帳戶,設為集區身分識別,授權系統暫存目錄 | 密碼管理、SPN、Kerberos 複雜度高 |
<%=(System.IO.Path.GetTempPath())%> 觀察實際使用的暫存路徑是否已切換至使用者目錄。「載入使用者設定檔 = True」是解決 ASP.NET 「拒絕存取暫存目錄」最標準、維護成本最低的方案,適用於 IIS 7.5 以上所有版本(含 Windows Server 2012 R2/2016/2019/2022、Azure App Service 自訂容器)。請直接套用,避免陷入權限遞迴授權的泥沼。