使用 Visual Studio ASP.NET Web 部署:Web.config文件转换

作者 :Tom Dykstra

下载初学者项目

本教程系列介绍如何使用 Visual Studio 2012 或 Visual Studio 2010 将 (发布) ASP.NET Web 应用程序部署到Azure 应用服务 Web 应用或第三方托管提供程序。 有关该系列的信息,请参阅 系列中的第一个教程

概述

本教程介绍如何在将 Web.config 文件部署到不同目标环境时自动执行更改过程。 大多数 应用程序Web.config文件中 的设置在部署应用程序时必须不同。 自动执行这些更改的过程使你不必在每次部署时手动执行这些更改,这会很繁琐且容易出错。

提醒:如果在完成本教程时收到错误消息或某些内容不起作用,请确保检查故障排除页面

Web.config转换与 Web 部署参数

可通过两种方法自动更改 Web.config 文件设置: Web.config转换Web 部署参数Web.config转换文件包含 XML 标记,这些标记指定在部署Web.config文件时如何更改该文件。 可以为特定生成配置和特定发布配置文件指定不同的更改。 默认生成配置为“调试”和“发布”,你可以创建自定义生成配置。 发布配置文件通常对应于目标环境。 (你将在 部署到 IIS 作为测试环境 教程中详细了解发布配置文件。)

Web 部署参数可用于指定部署期间必须配置的多种不同设置,包括 Web.config 文件中的设置。 当用于指定 Web.config 文件更改时,Web 部署参数的设置更为复杂,但在部署之前不知道要设置的值时,这些参数非常有用。 例如,在企业环境中,可以创建 一个部署包 ,并将其提供给 IT 部门中的人员以在生产环境中安装,并且该人员必须能够输入你不知道的连接字符串或密码。

对于本教程系列介绍的方案,你事先知道必须对 Web.config 文件执行的所有操作,因此无需使用 Web 部署参数。 你将配置一些转换,这些转换因所使用的生成配置而异,而有些转换因使用的发布配置文件而异。

在 Azure 中指定Web.config设置

如果要更改的Web.config文件设置位于 或 <appSettings> 元素中<connectionStrings>,并且要部署到 Azure 应用服务 中的Web 应用,则可以使用另一个选项在部署期间自动执行更改。 可以在 Web 应用的管理门户页的“ 配置 ”选项卡中输入要在 Azure 中生效的设置, (向下滚动到 ) 的应用设置连接字符串 部分。 部署项目时,Azure 会自动应用更改。 有关详细信息,请参阅 Windows Azure 网站:应用程序字符串和连接字符串的工作原理

默认转换文件

“解决方案资源管理器”中,展开“Web.config”,查看默认为两个默认生成配置创建的Web.Debug.configWeb.Release.config转换文件。

Web.config_transform_files

可以通过右键单击Web.config文件并从上下文菜单中选择“ 添加配置转换 ”,为自定义生成配置配置创建转换文件。 在本教程中,无需执行此操作,并且菜单选项已禁用,因为尚未创建任何自定义生成配置。

稍后将再创建三个转换文件,分别用于测试、过渡和生产发布配置文件。 一个典型的设置示例,你将在发布配置文件转换文件中处理,因为它依赖于目标环境,这是一个 WCF 终结点,该终结点在测试与生产方面是不同的。 在后续教程中创建发布配置文件转换文件后,你将创建发布配置文件转换文件。

禁用调试模式

属性是 依赖于生成配置而不是目标环境的设置的一 debug 个示例。 对于发布版本,无论部署到哪个环境,你通常都希望禁用调试。 因此,默认情况下,Visual Studio 项目模板创建Web.Release.config使用从 compilation 元素中删除 debug 属性的代码转换文件。 下面是默认 Web.Release.config:除了注释掉的一些示例转换代码外,它还包括删除 属性的 compilationdebug 元素中的代码:

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

<!-- For more information on using web.config transformation visit https://go.microsoft.com/fwlink/?LinkId=125889 -->

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <!--
    In the example below, the "SetAttributes" transform will change the value of 
    "connectionString" to use "ReleaseSQLServer" only when the "Match" locator 
    finds an attribute "name" that has a value of "MyDB".
    
    <connectionStrings>
      <add name="MyDB" 
        connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True" 
        xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
    </connectionStrings>
  -->
  <system.web>
    <compilation xdt:Transform="RemoveAttributes(debug)" />
    <!--
      In the example below, the "Replace" transform will replace the entire 
      <customErrors> section of your web.config file.
      Note that because there is only one customErrors section under the 
      <system.web> node, there is no need to use the "xdt:Locator" attribute.
      
      <customErrors defaultRedirect="GenericError.htm"
        mode="RemoteOnly" xdt:Transform="Replace">
        <error statusCode="500" redirect="InternalError.htm"/>
      </customErrors>
    -->
  </system.web>
</configuration>

属性xdt:Transform="RemoveAttributes(debug)"指定希望从system.web/compilation部署的 debugWeb.config文件中的 元素中删除特性。 每次部署发布版本时都会完成此操作。

将错误日志访问权限限制为管理员

如果应用程序运行时出错,应用程序将显示一个通用错误页来代替系统生成的错误页,并使用 Elmah NuGet 包 进行错误日志记录和报告。 customErrors应用程序Web.config文件中的 元素指定错误页:

<customErrors mode="RemoteOnly" defaultRedirect="~/GenericErrorPage.aspx">
  <error statusCode="404" redirect="~/GenericErrorPage.aspx" />
</customErrors>

若要查看错误页,请暂时将 mode 元素的 customErrors 属性从“RemoteOnly”更改为“开”,并从 Visual Studio 运行应用程序。 通过请求无效 URL(例如 Studentsxxx.aspx)导致错误。 你会看到 GenericErrorPage.aspx 页,而不是 IIS 生成的“找不到资源”错误页。

错误页

若要查看错误日志,请将端口号后 URL 中的所有内容替换为 elmah.axd (例如, http://localhost:51130/elmah.axd) 然后按 Enter:

ELMAH 页

完成后,不要忘记将 customErrors 元素重新设置为“RemoteOnly”模式。

在开发计算机上,允许免费访问错误日志页是很方便的,但在生产环境中会存在安全风险。 对于生产站点,需要添加一个授权规则来限制管理员访问错误日志,并确保该限制也适用于测试和暂存。 因此,这是每次部署发布版本时要实现的另一项更改,因此它属于 Web.Release.config 文件。

打开Web.Release.config,紧跟在结束configuration标记前添加新location元素,如下所示。

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
  <!--
    In the example below, the "SetAttributes" transform will change the value of 
    "connectionString" to use "ReleaseSQLServer" only when the "Match" locator 
    finds an attribute "name" that has a value of "MyDB".
    
    <connectionStrings>
      <add name="MyDB" 
        connectionString="Data Source=ReleaseSQLServer;Initial Catalog=MyReleaseDB;Integrated Security=True" 
        xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
    </connectionStrings>
  -->
  <system.web>
    <compilation xdt:Transform="RemoveAttributes(debug)" />
    <!--
      In the example below, the "Replace" transform will replace the entire 
      <customErrors> section of your web.config file.
      Note that because there is only one customErrors section under the 
      <system.web> node, there is no need to use the "xdt:Locator" attribute.
      
      <customErrors defaultRedirect="GenericError.htm"
        mode="RemoteOnly" xdt:Transform="Replace">
        <error statusCode="500" redirect="InternalError.htm"/>
      </customErrors>
    -->
  </system.web>
  <location path="elmah.axd" xdt:Transform="Insert">
    <system.web>
      <authorization>
        <allow roles="Administrator" />
        <deny users="*" />
      </authorization>
    </system.web>
  </location>
</configuration>

TransformInsert”的属性值使此location元素作为同级添加到Web.config文件中的任何现有location元素。 (已经有一个 location 元素指定 “更新额度 ”页的授权规则。)

现在可以预览转换,以确保正确编码。

“解决方案资源管理器”中,右键单击“Web.Release.config”,然后单击“预览转换”。

“预览转换”菜单

此时会打开一个页面,其中显示了左侧的开发 Web.config 文件,以及右侧部署 Web.config 文件的外观,并突出显示了更改。

调试转换预览

显示Web.config预览版的屏幕截图,其中左侧是开发文件,右侧是部署文件的外观,其中突出显示了更改。

( 在预览版中,你可能会注意到一些未为其编写转换的其他更改:这些更改通常涉及删除不影响功能的空白。)

部署后测试站点时,还将测试以验证授权规则是否有效。

注意

安全说明 切勿在生产应用程序中向公众显示错误详细信息,或将这些信息存储在公共位置。 攻击者可以使用错误信息来发现站点中的漏洞。 如果在自己的应用程序中使用 ELMAH,请配置 ELMAH 以最大程度地降低安全风险。 不应将本教程中的 ELMAH 示例视为建议的配置。 这是为了说明如何处理应用程序必须能够在其中创建文件的文件夹而选择的示例。 有关详细信息,请参阅 保护 ELMAH 终结点

你将在发布配置文件转换文件中处理的设置

一种常见方案是 Web.config在部署到 的每个环境中必须不同的文件设置。 例如,调用 WCF 服务的应用程序在测试和生产环境中可能需要不同的终结点。 Contoso University 应用程序还包括此类设置。 此设置控制站点页面上的可见指示器,告知你处于哪个环境,例如开发、测试或生产环境。 设置值确定应用程序是将“ (开发) ”还是“ (测试) ”追加到 Site.Master 母版页中的main标题:

环境指示器

当应用程序在过渡或生产环境中运行时,将省略环境指示器。

Contoso University 网页读取在Web.config 文件中设置appSettings的值,以确定应用程序在哪个环境中运行:

<appSettings>
    <add key="Environment" value="Dev" />
</appSettings>

在测试环境中,该值应为“Test”,对于过渡和生产,该值应为“Prod”。

转换文件中的以下代码将实现此转换:

<appSettings>
    <add key="Environment" value="Test" xdt:Transform="SetAttributes" xdt:Locator="Match(key)"/>
</appSettings>

xdt:Transform属性值“SetAttributes”指示此转换的目的是更改Web.config文件中现有元素的属性值。 xdt:Locator属性值“匹配 (键) ”指示要修改的元素是其key属性与此处指定的属性匹配key的元素。 元素的唯一另一 add 个属性是 value,这是将在部署 的Web.config 文件中更改的内容。 此处显示的代码会导致在value部署的 Web.config 文件中将 元素的 EnvironmentappSettings 属性设置为“Test”。

此转换属于尚未创建的发布配置文件转换文件中。 在为测试、过渡和生产环境创建发布配置文件时,你将创建和更新实现此更改的转换文件。 你将在 部署到 IIS部署到生产 教程中执行此操作。

注意

由于此设置位于 元素中<appSettings>,因此在部署到 Web 应用 时,可以使用另一种方法来指定转换Azure 应用服务本主题前面的请参阅在 Azure 中指定Web.config设置

设置连接字符串

尽管默认转换文件包含演示如何更新连接字符串的示例,但在大多数情况下,无需设置连接字符串转换,因为可以在发布配置文件中指定连接字符串。 你将在 部署到 IIS部署到生产 教程中执行此操作。

总结

现在,在创建发布配置文件之前,你已对 Web.config 转换做了尽可能多的操作,并且你已看到部署的 Web.config 文件中的内容的预览。

显示“Web.config预览”的屏幕截图,其中左侧是“原始Web.config”文件,右侧是“已转换Web.config”文件的外观,其中突出显示了更改。

在以下教程中,你将处理需要设置项目属性的部署设置任务。

更多信息

有关本教程涵盖的主题的详细信息,请参阅在 Visual Studio 和 ASP.NET 的 Web 部署内容映射中 ,使用Web.config转换更改目标Web.config文件或app.config文件中 的设置。