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

ASP.NET 子目錄 web.config 衝突導致「區段只能用於應用程式層級」錯誤解決

     編輯:ASP.NET 基礎

錯誤訊息

分析器錯誤訊息:在應用程式層級之外使用註冊為 allowDefinition='MachineToApplication' 的區段是錯誤的。如果在 IIS 中沒有將虛擬目錄設定為應用程式,則可能導致此錯誤。 來源檔案:C:\Program Files\pdd\pro\web.config 第 127 行

根因分析

  • ASP.NET 應用程式根目錄已有 web.config,其中定義 <sessionState>、<authentication> 等僅允許在應用程式根層級的區段(allowDefinition="MachineToApplication")。
  • 子目錄 pro 同樣放置 web.config 並重複定義這些區段,導致設定系統在合併層級設定時拋出錯誤。
  • 其他頁面正常運作是因為它們不在 pro 子目錄下,未受該錯誤 web.config 影響。

解決方案

  1. 刪除子目錄 web.config(最簡單):若 pro 目錄不需獨立設定,直接刪除 pro\web.config,繼承根目錄設定即可。
  2. 將子目錄轉為 IIS 應用程式:在 IIS 中右鍵 pro →「轉換為應用程式」,使其擁有獨立應用程式根,可擁有完整 web.config。
  3. 僅保留子目錄允許的區段:若需在子目錄覆寫設定,僅保留 <appSettings>、<connectionStrings>、<location>、<system.webServer/handlers> 等允許在子層級的區段,移除 <sessionState>、<authentication>、<httpModules> 等根層級專用區段。

允許層級對照表

區段allowDefinition可用層級
<sessionState>MachineToApplication機器、網站、應用程式根
<authentication>MachineToApplication機器、網站、應用程式根
<httpModules> / <httpHandlers>MachineToApplication機器、網站、應用程式根
<appSettings>Everywhere任意層級
<connectionStrings>Everywhere任意層級
<location>Everywhere任意層級(含 path 屬性指定子路徑)
<system.webServer>AppHostOnly / Everywhere視子區段而定

排查步驟實錄(避坑指南)

  1. 檢視錯誤頁面指出的 來源檔案路徑與行號,確認是哪個 web.config。
  2. 比對根目錄與子目錄 web.config,找出重複的根層級區段。
  3. 確認子目錄是否已在 IIS 設為應用程式(圖示為齒輪圖示)。
  4. 若非應用程式,刪除或精簡子目錄 web.config。
  5. 儲存後瀏覽驗證,錯誤即消失。

最佳實務

  • 專案結構規劃階段即決定哪些資料夾為獨立應用程式,避免後期衝突。
  • 使用 <location path="pro"> 在根 web.config 中針對子目錄覆寫設定,而非放置子 web.config。
  • 部署腳本自動檢查:禁止非應用程式目錄包含 MachineToApplication 區段。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved