ASP.NET 組態檔階層架構和繼承

更新:2007 年 11 月

您可以將 ASP.NET 組態檔散發至整個應用程式目錄,以設定繼承階層架構中的 ASP.NET 應用程式。這個結構可以讓您在不影響上層目錄組態設定的情況下,在適當的目錄層級達到應用程式所需的組態詳細資訊層級。

此主題包括下列章節:

  • 組態結構

  • 組態繼承

  • 組態設定範圍

  • 在執行階段計算組態設定

  • 在單一檔案中設定多個 ASP.NET 資源

  • 虛擬和實體路徑之間的設定衝突

  • 限制 ASP.NET 繼承

組態結構

ASP.NET 組態檔稱為 Web.config 檔,並且能夠出現在 ASP.NET 應用程式的多個目錄中。ASP.NET 組態階層架構有下列特性:

  • 使用組態檔套用至相同目錄中的資源,並且套用至所有子目錄

  • 能夠讓您將組態資料置於適當的範圍:整個電腦、所有 Web 應用程式、個別應用程式或應用程式中的子目錄

  • 允許覆寫從組態階層架構中較高層所繼承的組態設定。也允許鎖定組態設定以避免被較低層的組態設定所覆寫

  • 將組態設定的邏輯群組組織成區段

組態繼承

所有 .NET Framework 應用程式都會從名為 systemroot\Microsoft .NET\Framework\versionNumber\CONFIG\Machine.config 的檔案繼承基本組態設定和預設值。Machine.config 檔是用於整個伺服器範圍的組態設定。您無法在階層架構中較低層的組態檔內覆寫某些設定。

.NET 用戶端應用程式 (主控台和 Windows 應用程式) 會使用名為 ApplicationName.config 的組態檔覆寫所繼承的設定。ASP.NET 應用程式會使用名為 Web.config 的組態檔覆寫所繼承的設定。

ASP.NET 組態階層架構的根目錄是指根目錄 Web.config 的檔案,並且會跟 Machine.config 檔位於相同目錄中。根目錄 Web.config 檔繼承自 Machine.config 檔中的所有設定。根目錄 Web.config 檔包含的設定,會套用至執行 .NET Framework 特定版本的所有 ASP.NET 應用程式。因為每個 ASP.NET 應用程式都從根 Web.config 檔案繼承預設組態設定,所以只需要為覆寫預設值的設定建立 Web.config 檔案。

集合項目中的繼承

某些組態項目是集合,例如命名空間customErrors 項目。

在集合中,組態設定通常會經由 add 子項目加入集合中、經由 remove 子項目根據索引鍵名稱移除組態設定,或是可以經由 clear 子項目清除整個集合。除非允許重複的設定,否則在子組態檔中加入的設定不會覆寫父組態檔中相同索引鍵名稱的設定。

注意事項:

舊版 .NET Framework 中存在的某些集合會使用不同的 add 子項目名稱。例如,customErrors 項目會使用 error 子項目將自訂錯誤加入集合。

如果收到的要求需要 SubDir1 目錄中不存在的檔案,ASP.NET 會從存放本機 Web.config 檔 (位於目前的目錄 (如果存在的話) 或是父目錄) 的目錄開始搜尋組態階層架構。ASP.NET 會搜尋 statusCode 屬性 (Attribute) 等於 "404" 的 customErrors 的 error 項目 (ASP.NET 設定結構描述) 項目。一旦 ASP.NET 找到 404 錯誤的組態設定,就會回傳 redirect 屬性中的 URL 當做回應。

組態設定範圍

組態設定有不同的範圍,某些是全域範圍,而某些只有對應用程式、根目錄 Web.config 檔或 Machine.config 檔範圍有效。

對於 ASP.NET 所包含的所有區段而言,任一組態區段的範圍都會定義於 Machine.config 檔案中 configSections 的 section 項目 (一般設定結構描述) 項目的 allowDefinition 屬性。例如,authentication 項目 (ASP.NET 設定結構描述) 項目具有 MachineToApplication 項目的 allowDefinition 屬性。這表示 authentication 項目能夠設定在應用程式層級的 Machine.config 檔、根目錄 Web.config 檔和 Web.config 檔中。如果設定在子目錄層級,就會擲回錯誤。如果區段並未定義 allowDefinition 屬性,則預設值為 Everywhere。

ASP.NET 組態設定一般組態設定 (ASP.NET) 的 [可設定的位置] 旁邊的 [項目資訊] 資料表中,會列出每個項目的組態設定範圍。

下表列出每個檔案在組態階層架構中的層級、檔案名稱,以及每個檔案的重要繼承特性說明。

組態層級

檔案名稱

檔案說明

伺服器

Machine.config

Machine.config 檔包含伺服器上所有 Web 應用程式的 ASP.NET 結構描述。這個檔案是在組態合併階層架構的頂端

根網站

Web.config

伺服器的 Web.config 檔與 Machine.config 檔儲存在相同目錄中,並且包含大部分 system.web 組態區段的預設值。在執行階段時,當合併組態階層架構的頂端之後,再來就會合併這個檔案

網站

Web.config

特定網站的 Web.config 檔所包含的設定,會套用至網站並向下繼承至整個站台的所有 ASP.NET 應用程式和子目錄

ASP.NET 應用程式根目錄

Web.config

特定 ASP.NET 應用程式的 Web.config 檔位於應用程式的根目錄中,其中包含的設定會套用至 Web 應用程式,並向下繼承至其分支中所有的子目錄

ASP.NET 應用程式子目錄

Web.config

應用程式子目錄的 Web.config 檔中包含的設定,會套用至這個子目錄並向下繼承至其分支中所有的子目錄

用戶端應用程式目錄

ApplicationName.config

ApplicationName.config 檔包含 Windows 用戶端應用程式 (而不是 Web 應用程式) 的設定

ProcessModel 項目

其中一個 processModel 項目 (ASP.NET 設定結構描述) 項目會設定伺服器使用的處理模型,其中包含伺服器上的所有 ASP.NET 應用程式。因此,processModel 設定只能夠放在 Machine.config 檔中,並且任何 Web.config 檔中的設定都不能覆寫它們。

processModel 項目的變更只有在重新啟動背景工作處理序後才會生效,而不是與其他組態項目一樣,在變更設定後立即生效。

注意事項:

當您在網際網路資訊服務 (IIS) 6.0 的背景工作處理序隔離模式中執行 ASP.NET 時,就會使用 IIS 6.0 處理序模型並且忽略 Machine.config 檔 processModel 區段中的設定。若要設定處理序識別、循環或其他的處理序模型值,請使用 IIS 管理員設定應用程式的 IIS 背景工作處理序。當您將 IIS 6.0 設定為以 IIS 5.0 隔離模式執行 ASP.NET 時,將不會執行 ASP.NET 2.0。

在執行階段計算組態設定

伺服器收到需要特定 Web 資源的要求時,ASP.NET 會使用要求的 URL 虛擬目錄路徑中所有的組態檔,以階層式方式計算該資源的組態設定。本機組態設定會覆寫父組態檔的設定。

這些設定會計算一次,然後跨後續要求加以快取。當檔案階層架構內的組態檔有任何變更時,ASP.NET 會自動監看檔案變更並重新計算快取。當伺服器收到特定 URL 的要求時,ASP.NET 會使用快取中的組態設定階層架構尋找要求之資源。

除非組態區段項目包含 restartOnExternalChanges="false" 屬性,或是組態設定包含在使用 configSource 屬性連結至 Web.config 檔的不同檔案中,否則當組態變更時應用程式會重新啟動。

在單一檔案中設定多個 ASP.NET 資源

在管理大量組態設定或 ISP 設定中的用戶端網站時,將許多位置的設定儲存在一個 Web.config 檔中會很有用。您可以使用位置項目的 path 屬性,設定儲存在應用程式子目錄中的許多特定 ASP.NET 資源。

如需如何使用位置項目的詳細資訊,請參閱 HOW TO:使用位置設定設定特定的目錄

虛擬和實體目錄之間的設定衝突

虛擬目錄的組態設定獨立於實體目錄結構,且虛擬目錄必須經過仔細組織以免組態發生問題。例如,您可能有名為 MyResource.aspx 的 ASP.NET 檔案,而其具有下列實體目錄結構。

C:
    \Subdir1
        \Subdir2
            \MyResource.aspx

此外,也可能會有位於 Subdir1 的組態檔、名為 Vdir1 並對應至 c:\Subdir1 的虛擬目錄,以及名為 Vdir2 並對應至 c:\Subdir1\Subdir2 的虛擬目錄。如果用戶端使用 URL https://localhost/vdir1/subdir2/MyResource.aspx 搭配 c:\Subdir1\Subdir2\MyResource.aspx 的實體位置存取資源,則資源會從 Vdir1 繼承組態設定。然而,如果用戶端使用 URL https://localhost/vdir2/MyResource.aspx 存取相同資源,則該資源並不會從 Vdir1 繼承設定。以這種方式建立虛擬目錄可能會導致非預期的結果,甚至是應用程式失敗。建議您不要巢狀 (Nest) 虛擬目錄,如果要這樣做的話,僅使用一個 Web.config 檔。

限制 ASP.NET 繼承

您可能想要限制組態設定的繼承以增強應用程式效能、維持高可靠度並簡化管理。限制是由 allowOverride、lockAttributes、lockAllAttributesExcept、lockAllElementsExcept、lockItem 和 lockElements 屬性控制。如需這些屬性的詳細資訊,請參閱 Section 項目繼承的一般屬性

未處理之例外狀況的組態設定

建立 ASP.NET 應用程式期間,Common Language Runtime (CLR) 會處理包含在 Aspnet.config 檔案內的設定。這些以及其他設定會指示 CLR 如何處理未處理的例外狀況。這些組態設定如下所示:

<legacyUnhandledExceptionPolicy enabled="false" />

如需詳細資訊,請參閱 Managed 執行緒中的例外狀況

請參閱

工作

HOW TO:使用位置設定設定特定的目錄

HOW TO:鎖定 ASP.NET 組態設定

參考

Section 項目繼承的一般屬性