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

ASP.NET 部署錯誤「拒絕訪問臨時目錄」終極解決方案

     編輯:ASP.NET 基礎

錯誤現象

將 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” -- “拒絕存取。”

根因分析

  • ASP.NET 執行階段需在「暫存 ASP.NET 檔案」目錄編譯動態生成的類別(如 App_global.asax、Razor 視圖、Web Forms 頁面)。
  • 應用程式集區身分識別(預設 ApplicationPoolIdentity,顯示為 IIS APPPOOL\PoolName)必須擁有該目錄的讀寫權限。
  • 單純給 C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Temporary ASP.NET Files 加權限常因繼承中斷、多層級目錄導致失效。

最簡有效解法:啟用「載入使用者設定檔」

  1. 開啟 IIS 管理員 → 應用程式集區。
  2. 右鍵選擇對應集區 → 進階設定。
  3. 找到 處理序模型 區段 → 載入使用者設定檔 → 設為 True。
  4. 確定並 重啟應用程式集區(或執行 iisreset)。

IIS 應用程式集區進階設定 - 載入使用者設定檔 = True

原理說明

  • Load User Profile = true 會讓 Worker Process (w3wp.exe) 載入該身分識別的完整使用者設定檔,包含 %TEMP%、%TMP% 環境變數指向的使用者專屬暫存目錄(通常在 C:\Users\\AppData\Local\Temp)。
  • ASP.NET 執行階段偵測到使用者設定檔已載入,會優先使用使用者暫存目錄而非系統級 Temporary ASP.NET Files,權限問題自然解決。
  • 此設定也能修正其他依賴使用者設定檔的功能(如憑證存取、登錄 HKEY_CURRENT_USER、COM 元件啟動)。

替代方案(不建議常態使用)

方案操作缺點
手動授權系統暫存目錄對 IIS APPPOOL\PoolName 給 Temporary ASP.NET Files 完整控制權目錄層級深、繼承易斷、Windows 更新可能重置權限
自訂暫存目錄在 web.config 設定 <compilation tempDirectory="D:\AspNetTemp" /> 並授權需額外維護目錄、磁碟空間、備份策略
改用具名服務帳戶建立網域/本機帳戶,設為集區身分識別,授權系統暫存目錄密碼管理、SPN、Kerberos 複雜度高

驗證步驟

  1. 啟用設定後,重新整理網頁,錯誤應消失。
  2. 若仍報錯,檢查事件檢視器 → 應用程式 日誌,確認是否為其他權限問題(如資料庫連線、檔案上傳目錄)。
  3. 可在頁面加入 <%=(System.IO.Path.GetTempPath())%> 觀察實際使用的暫存路徑是否已切換至使用者目錄。

總結

「載入使用者設定檔 = True」是解決 ASP.NET 「拒絕存取暫存目錄」最標準、維護成本最低的方案,適用於 IIS 7.5 以上所有版本(含 Windows Server 2012 R2/2016/2019/2022、Azure App Service 自訂容器)。請直接套用,避免陷入權限遞迴授權的泥沼。

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