共用方式為


ApplicationHost.config 簡介

作者 :Tobin Titus

簡介

當您使用 IIS 7 和更新版本時,ApplicationHost.config 是組態系統的根檔案。 其中包含所有網站、應用程式、虛擬目錄和應用程式集區的定義,以及 Web 伺服器設定的全域預設值, (類似於 machine.config,以及 .NET Framework 設定的根 web.config) 。

此外,它也是安裝網頁伺服器時唯一可用的 IIS 組態檔 (,不過,如果使用者想要) ,使用者仍然可以新增 web.config 檔案。 其中包含稱為 configSections 的特殊區段 () ,用於註冊所有 IIS 和 Windows 啟用系統 (WAS) 區段 (machine.config 具有與 .NET Framework 區段相同的概念) 。 它具有將大部分 IIS 區段鎖定至全域層級的定義,因此根據預設,階層中的較低層級 web.config 檔案無法覆寫它們。

檔案的位置目前位於 %windir%\system32\inetsrv\config 目錄中。 本檔會逐步解說所有區段,依照檔案中出現的順序,逐一說明。 最複雜的區段是 system.webServer,因此建議讀者不要略過讀取該區段的描述。

請注意:

  1. 本檔會指定每個組態區段的內容,如 applicationHost.config 所示。根據設計,許多區段都是空的,或不是完整的, (只有部分內容會出現在 XML) 中。 其餘的值會取自架構預設值。 這麼做是為了避免檔案太多資訊和雜亂,並讓檔案保持可合理閱讀。

    • 如需完整的架構參考,包括每個區段中所有屬性的預設值、其有效範圍等,請參閱 %windir%\system32\inetsrv\config\schema\IIS\_Schema.xml IIS 設定) 的 (,或 ASPNET\_Schema.xml ASP.NET 設定) 的 (,或針對其他 .NET Framework 設定 FX_Schema.xml () 。
    • 為了方便起見,這些檔案的區塊會包含在適當的章節中,以便讀者瞭解可用的屬性、每個區段的預設值等等。 請參閱下列其他附註,以瞭解如何讀取架構資訊。
  2. 在對檔案進行任何變更之前,先進行檔案的備份。

如何讀取設定架構

如上所述,本檔包含每個區段的架構信息代碼段,因此讀者可以探索可用的屬性,以及其預設值和有效範圍。 代碼段會直接從 IIS 設定的組態架構檔取得: %windir%\system32\inetsrv\config\schema\IIS\_Schema.xml。 本節說明如何讀取架構資訊。

每個組態區段的架構都會定義於 XML 元素中。 區段群組沒有架構定義。 此處使用下列格式來說明如何讀取架構:

<attribute-name>="<default-value>"  [<metadata>] [<description>]

<attribute-name> 是組態屬性的名稱,如 XML 所示。 每個屬性都必須有名稱。

<default-value> 是預設使用的值,如果未在屬性的 XML 中指定其他值, 並非所有屬性都有預設值 (例如網站名稱) 。 在此情況下,語法會是 “ ”

<metadata> 包含數個專案:

  • 屬性的運行時間類型。 這是其中一個 “bool”、“enum”、“flags”、“int”、“int64”、“String”、“timeSpan”。 每個屬性都必須有類型。
  • “bool” 為 “true” 或 “false”。
  • “enum” 是一組可能的值,其中只能設定屬性的其中一個值。 每個這類值都有數值和易記名稱。 語法使用字元 「|」 做為易記名稱之間的分隔符:value1|value2|...|valueN。
  • “flags” 類似於 “enum”,不同之處在於允許值的組合。 因此,數值應該在 2 的倍數中,因此它們可以一起成為 ORed,以形成組合。 語法與 “enum” 相同:value1|value2|...|valueN。
  • “int” 是 32 位整數。
  • “int64” 是 64 位整數。
  • “String” 是字元字串。
  • “timeSpan” 是時間單位的表示法,類似於Managed程式碼類型 TimeSpan。 它可以保存為代表秒數的數位 (,或) 分鐘數;或格式為 “[dd:]hh:mm:ss” 格式的格式化字串。 “[dd:]” 元素代表選擇性天數。 其他元素分別代表時數、分鐘數和秒數。 “timeSpanFormat” 屬性會指定應該使用的格式:秒數、分鐘數或格式化字串。
  • 必要屬性標示為「必要」。 這表示它們的值必須在 XML 中設定。 例如,網站名稱是必要屬性, (每個網站都必須在 IIS 7.0 和更新版本中具有名稱) 。

<description> 是屬性的簡短描述。

區段架構

<sectionSchema> XML 元素是架構資訊的基底單位。 所有其他架構信息都會在其內指定。 它直接在其中有一個屬性 (「name」) ,而架構的其餘部分則位於其中的子元素中:

<sectionSchema name=""  <!-- [String, Required] [XML full path of the section] --> >
    <!-- sub-elements here describing rest of schema; -->
    <!-- their description is right below in the doc. --> 
</sectionSchema>

屬性架構

每個屬性都會在架構中的對應 <attribute> XML 元素中定義。 <attribute>如果屬性位於區段範圍) 中,則專案可能直接位於 <sectionSchema> (元素中;如果屬性位於區段) 內的子元素中,則 (;如果屬性位於區段) 內的集合中,則 <> (集合元素中。

屬性架構必須指定屬性的名稱和運行時間類型。 它可能會將 屬性標示為必要。 如果集合內部) 或集合索引鍵 (與其他屬性) ,它可能會將屬性標示為唯一索引鍵 (。 它可以指定 屬性的預設值。 它可能會標示屬性以進行磁碟上的自動加密。 它可能會指定是否允許 「Infinite」 這個字做為屬性的值, (僅適用於 int 和 in64 等數值類型,以及 timeSpan) 。 它可以指定時間範圍格式 (秒、分鐘或時間範圍屬性的格式化字串) 。 它可以指定屬性的驗證規則, (請參閱本檔下方的屬性驗證一節) 。

<attribute
    name=""  [String, Required] [XML name of the attribute]
    type=""  [bool|enum|flags|int|int64|string|timeSpan, Required][Runtime type]
    required="false"  [bool] [Indicates if must be set]
    isUniqueKey="false"    [bool] [Serves as the collection key]
    isCombinedKey="false"  [bool] [Part of a multi-attribute key]
    defaultValue=""  [String] [Default value or comma-delimited flags]
    encrypted="false"  [bool] [Indicates if value persisted encrypted]
    allowInfinite="false"  [bool] [Indicates if "Infinite" can be set]
    timeSpanFormat="string" [string|seconds|minutes] [hh:mm:ss or number]
    validationType=""       [See validation below]
    validationParameter=""  [See validation below]
/>

元素架構

每個元素都會在架構中的對應 <element> XML 元素中定義。 專案可以是巢狀結構。 元素只是其他屬性或子元素的容器。 它必須具有名稱,而且它可以做為集合元素的容器 (,例如,siteDefaults 會保留集合中網站) 的 <sites> 預設值。

集合架構

每個集合都會定義於架構中對應的 <集合> XML 元素中。 集合包含多個元素,可以個別新增和移除這些專案。 一般而言,集合指示詞名稱為 「add」、“remove” 和 「clear」,但某些集合會使用不同的名稱 (,例如,集合使用 「site」 而不是 「add」 ) 。

這是藉由在集合架構中指定 addElement、removeElement 和 clearElement 的值來完成。 如果架構中缺少集合指示詞,則集合將不支援它。 集合架構可以指定預設項目的名稱,此專案名稱將作為集合元素的容器, (此補碼為元素架構中的 isCollectionDefault) 。

例如,集合使用siteDefaults做為預設專案。 大部分的集合會在將組態檔合併至命名空間時附加元素,但有些集合可能會在架構中指定 mergeAppend=“false”,以具有前置行為。 例如,請考慮兩種設定層級:站台中的 applicationHost.config 和 web.config。 在 applicationHost.config:

<myCollection>
    <add value="1"/> 
</myCollection>

在 web.config:

<myCollection>

    <add value="2" />        
</myCollection>

如果集合附加,其合併 (月臺層級的有效) 組態將會是:

<myCollection>

    <add value="1"/>

    <add value="2"/>    
</myCollection>

不過,如果其前面加上,則會是:

<myCollection>

    <add value="2"/>

    <add value="1"/>    
</myCollection>

某些集合可以藉由在其架構中指定allowDuplicates=“true” 來允許重複的專案。 這主要是為了在 machine.config) 中支援 .NET Framework 中的舊版集合 (。

某些集合可能會允許它們中的其他屬性,超出架構中指定的屬性。 這是藉由在其架構中指定allowUnrecognizedAttributes=“true” 來完成。 大部分都是為了支援 .NET Framework 中的提供者型集合。

<collection            
    addElement=""     [String] [Name of Add directive, if supported]
    removeElement=""  [String] [Name of Remove directive, if supported]
    clearElement=""   [String] [Name of Clear directive, if supported]
    defaultElement="" [applicationDefaults|applicationPoolDefaults|siteDefaults|virtualDirectoryDefaults] [See isCollectionDefault]
    mergeAppend="true"  [bool] [Indicates whether or not deepest set values are appended]  
    allowDuplicates="false"  [bool] [Indicates if multiple elements may have the same keys]
    allowUnrecognizedAttributes="false"  [bool] [Indicates if non-schema attributes ok]
/>

列舉架構

“enum” 類型的每個屬性都必須在架構中對應的 <列舉 XML 元素中定義其列舉> 值。 每個值都必須有易記名稱和數值。

<enum name=""  [String, Required] [Friendly name of the enum]
    value="" [int, Required] [Numeric value]
/>

旗標架構

“flags” 類型的每個屬性都必須在架構中對應的 XML 元素中定義其旗標值。 每個旗標都必須有易記的名稱和數值,這些值可以與其他值一起形成組合;因此,此值應該在 2 的倍數中。

<flags            
    name=""  [String, Required] [Friendly name of the flag]
    value="" [int in power of 2, Required] [Numeric value]
/>

屬性驗證

剖析 XML 以從檔案取得區段,以及呼叫組態 API 來設定值時,會完成屬性驗證。 如果驗證失敗,它會 (取得區段或設定無效的值) 失敗。

每個屬性可能會為其值建立一個驗證程序關聯。 這可藉由在 validationType 中指定適當的驗證程式名稱,以及在屬性架構的 validationParameter 中指定其他參數來完成。

系統支援下列驗證程式:

ApplicationPoolName 驗證程式

此驗證程式在這些字元上失敗: |<>&」

validationType="applicationPoolName" validationParameter=""

IntegerRange 驗證程式

如果值超出 [inside] 範圍,整數則這個驗證程序會失敗。

validationType="integerRange"
validationParameter="<minimum>,<maximum>[,exclude]"

NonEmptyString 驗證程式

如果設定字串值,這個驗證程式就會失敗。

validationType="nonEmptyString"
validationParameter=""

SiteName 驗證程式

此驗證程式會在下列字元上失敗:/.?

validationType="siteName"
validationParameter=""

TimeSpanRange 驗證程式

如果值超出 [內部] 範圍,則此驗證程式會失敗,以秒為單位。

validationType="timeSpanRange"
validationParameter="<minimum>,<maximum>,<granularity>[,exclude]"

TrimWhiteSpace 驗證程式

如果在值開頭或結尾設定空格符,這個驗證程式就會失敗。

validationType="trimWhiteSpaceString"
validationParameter=""

XML 標頭

每個組態檔都是 XML 檔案,而且可以選擇性地包含下列這一行作為第一行:

<?xml version="1.0" encoding="UTF-8" ?>

此外,它必須在 XML <組態> 標籤中包含其所有內容:

<configuration>

   <!-- [All of the context goes here] -->

</configuration>

ApplicationHost.config 包含上述幾行。 本檔的其餘部分會逐步解說檔案中的其餘區段。

<configSections> 部分

這是檔案中的第一個區段。 其中包含檔案中所有其他區段的清單。 這是 (區段的註冊點,例如,若要從系統取消註冊區段,請從本節中移除其行 – 不需要從 config\schema 目錄移除其架構檔案) 。

請注意,其他組態檔也可能有一個區段,位於檔案頂端。 這在低於全域層級的層級註冊區段可能很有用。 這些區段只會針對命名空間的範圍註冊。 Web.config 檔案只能將區段新增至系統;它們無法重新定義在父層級中註冊的區段,也無法移除 (取消註冊) 區段。

區段的結構是由其包含區段群組的階層所組成。 每個區段註冊都會指定區段名稱;區段處理程式的 Managed 程式代碼類型 (這在此檔案中沒有任何意義,而且會在 beta2 之後移除 , 它只會由 System.Configuration 使用,因此它仍存在於 machine.config 中,而且 web.config 檔案) ;allowDefinition 層級,如果與預設值不同則為 ;和 overrideModeDefault (這個屬性是用來鎖定此檔案中大部分的 IIS 區段) 。

注意

區段是組態設定的基本部署、註冊、鎖定、搜尋和內含單位。 每個區段都屬於一個區段群組, (「立即父系」) 。 區段群組是邏輯相關區段的容器,僅用於結構化階層。 無法對區段群組執行任何作業。 區段群組無法直接 (設定屬於區段) 。 區段群組可能是巢狀的;區段無法。

結構描述

<section
    name=""  [Required, Collection Key] [XML name of the section]
    allowDefinition="Everywhere" [MachineOnly|MachineToApplication|Everywhere] [Level where it can be set]
    overrideModeDefault="Allow"  [Allow|Deny] [Default delegation mode]
/>

鎖定

大部分的 IIS 區段預設會鎖定,使用 區段中的 overrideModeDefault=“Deny”。 解除鎖定區段的建議方式是使用標記,如下所示:

<location path="Default Web Site" overrideMode="Allow" >
  <system.webServer>
    <asp/>
  </system.webServer>            
</location>

上述位置標記只會解除鎖定默認網站的 區段。 若要為所有網站解除鎖定,請在 applicationHost.config 中指定此專案:

<location path="." overrideMode="Allow">
    <system.webServer>
         <asp/>
    </system.webServer>
</location>

注意

path=“.” 和 path=“” 具有相同的效果。 它們參考階層中的目前層級。