作者 :Tobin Titus
ApplicationHost.config 简介
注意
有关 IIS 的详细配置参考,请参阅 https://www.iis.net/configreference。
ApplicationHost.config 是使用 IIS 7 及更高版本时配置系统的根文件。 它包括所有站点、应用程序、虚拟目录和应用程序池的定义,以及 web 服务器设置的全局默认值, (类似于 machine.config,以及.NET Framework设置) 的根 web.config。
这也是一个特殊之处,因为它是安装 Web 服务器时唯一可用的 IIS 配置文件 (但是,如果用户想要) ,仍可以添加 web.config 文件。 它包括一个特殊部分 (名为 configSections) ,用于注册所有 IIS 和 Windows 激活系统 (WAS) 节 (machine.config 对) .NET Framework节具有相同的概念。 它具有将大多数 IIS 节锁定到全局级别的定义,因此默认情况下,层次结构中的较低级别 web.config 文件无法覆盖它们。
文件的位置当前位于 system32\inetsrv 目录中,但应在 beta2 之后更改为 system32\inetsrv\config。本文档按它们在文件中出现的顺序遍历所有部分,并逐个解释它们。 最复杂的部分是 <system.webServer>,因此建议读者不要特别跳过该部分。
如何读取配置架构
如前所述,本文档包含每个部分的架构信息片段,以便读者可以发现哪些属性可用,以及它们的默认值和有效范围。 代码片段直接取自 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”是时间单位的表示形式,类似于托管代码类型 TimeSpan。 它可以持久保存为数字 (表示秒或分钟) ;或 为格式为“[dd:]hh:mm:ss”格式的字符串。 “[dd:]”元素表示可选的天数。 其他元素分别表示小时数、分钟数和秒数。 “timeSpanFormat”属性指定应使用的格式:秒数、分钟数或格式化字符串。
- 所需属性标记为“必需”。 这意味着必须在 XML 中设置它们的值。 例如,站点名称是必需属性 (每个站点都必须在 IIS) 中具有一个名称。
<description>
是特性的简短说明。
节架构
<sectionSchema> XML 元素是架构信息的基本单位。 所有其他架构信息都在其中指定。 它直接在 (“name”) 中具有一个属性,然后架构的其余部分位于其中的子元素中。
属性架构
每个属性在架构中的相应 <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 is 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>
网站的默认值。
<ELEMENT>
name="" [String, Required] [XML name of the element]
isCollectionDefault="false" [bool] [Indicates if default values are held for other elements in this collection]
/>
集合架构
每个集合在架构中的相应 <集合> XML 元素中定义。 集合包含多个元素,可以单独添加和删除这些元素。 通常,集合指令名称为“add”、“remove”和“clear”,但为清楚起见,某些集合使用不同的名称 (例如,集合使用“site”而不是“add”) 。 这是通过在集合架构中指定 addElement、removeElement 和 clearElement 的值来完成的。 如果架构中缺少集合指令,则集合将不支持它。 集合架构可以指定默认元素的名称,该名称将用作集合元素默认值的容器, (这将补充元素架构) 中的 isCollectionDefault。
例如,集合使用 siteDefaults 作为默认元素。 大多数集合在将配置文件合并到命名空间中时会追加元素,但有些集合可能会在架构中指定 mergeAppend=“false”,以具有预先添加的行为。 例如,考虑两个级别的配置:站点中的 applicationHost.config 和 web.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”来允许重复条目。 这主要是为了支持 .NET Framework 中的旧集合 (machine.config) 。
某些集合可能允许其中的其他属性,超出架构中指定的属性。 这是通过在架构中指定 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 key]
allowUnrecognizedAttributes="false" [bool] [Indicates if non-schema attributes are ok]
/>
枚举架构
“enum”类型的每个属性都必须在架构中为其枚举值定义相应的 <枚举> XML 元素。 每个值都必须具有友好名称和数值。
<ENUM
name="" [String, Required] [Friendly name of the enumerator]
value="" [int, Required] [Numeric value]
/>
标志架构
“flags”类型的每个属性都必须在架构中的相应 XML 元素中定义其标志值。 每个标志必须有一个友好名称和一个数字值,该值可以与其他值一起进行 ORed,以形成组合;因此,它应为 2 的倍数。
<flags [Can be used together to form combinations, unlike enums]
name="" [String, Required] [Friendly name of the flag]
value="" [int in powers 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 验证器
- 如果值超出 [inside] 范围(以秒为单位),则此验证程序失败。
- validationType=“timeSpanRange”
validationParameter=“<minimum,maximum,granularity>>><<[,exclude]”
TrimWhiteSpace 验证器
- 如果在值的开头或末尾设置了空格,则此验证程序将失败。
- validationType=“requireTrimmedString”
validationParameter=“”
<configSections>
部分
这是文件中的第一部分。 它包含文件中所有其他部分的列表。 这是部分的注册点 (例如,若要从系统取消注册节,请从此节中删除其行 - 无需从 config\schema 目录) 中删除其架构文件。
请注意,其他配置文件的顶部可能也有一个节。 这对于在低于全局级别的级别注册节可能很有用。 这些部分将仅针对命名空间的该范围进行注册。 Web.config 文件只能向系统添加部分;它们无法重新定义在父级别中注册的分区,并且无法删除 (取消注册) 节。
这些节按其包含节组的层次结构进行结构。 每个分区注册指定节名称;节处理程序的托管代码类型 (此文件中没有任何意义,并且会在 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]
/>
锁定
默认情况下,使用 节中的 overrideModeDefault=“Deny”锁定了大多数 IIS 部分。 建议使用标记解锁分区,如下所示:
<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=“” 具有相同的效果。 它们引用层次结构中的当前级别。
总结
这有望让你熟悉新 applicationhost.config 的全新强大结构。若要向下钻取到不同的部分,应查看 位于 中的 %windir%\system32\inetsrv\config\schema\iis\_schema.xml
IIS 架构。