IIS 7 和 IIS 8 配置参考

作者 :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.xmlIIS 架构。