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,因此建議讀者不要略過讀取該區段的描述。
請注意:
本檔會指定每個組態區段的內容,如 applicationHost.config 所示。根據設計,許多區段都是空的,或不是完整的, (只有部分內容會出現在 XML) 中。 其餘的值會取自架構預設值。 這麼做是為了避免檔案太多資訊和雜亂,並讓檔案保持可合理閱讀。
- 如需完整的架構參考,包括每個區段中所有屬性的預設值、其有效範圍等,請參閱
%windir%\system32\inetsrv\config\schema\IIS\_Schema.xml
IIS 設定) 的 (,或ASPNET\_Schema.xml
ASP.NET 設定) 的 (,或針對其他 .NET Framework 設定 FX_Schema.xml () 。 - 為了方便起見,這些檔案的區塊會包含在適當的章節中,以便讀者瞭解可用的屬性、每個區段的預設值等等。 請參閱下列其他附註,以瞭解如何讀取架構資訊。
- 如需完整的架構參考,包括每個區段中所有屬性的預設值、其有效範圍等,請參閱
在對檔案進行任何變更之前,先進行檔案的備份。
如何讀取設定架構
如上所述,本檔包含每個區段的架構信息代碼段,因此讀者可以探索可用的屬性,以及其預設值和有效範圍。 代碼段會直接從 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=“” 具有相同的效果。 它們參考階層中的目前層級。