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

作者:Tom Dykstra

下载初学者项目

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

概述

本教程演示如何在将 Web.config 文件部署到不同的目标环境时自动执行更改 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 App 服务中的Web 应用,则可以选择在部署期间自动执行更改。 可以在 Web 应用的“管理门户”页的“配置”选项卡中输入要生效的设置(向下滚动到应用设置连接字符串部分)。 部署项目时,Azure 会自动应用更改。 有关详细信息,请参阅 Windows Azure 网站:应用程序字符串和连接字符串的工作原理

默认转换文件

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

Web.config_transform_files

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

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

禁用调试模式

依赖于生成配置而不是目标环境的设置示例是 debug 属性。 对于发布版本,通常希望禁用调试,而不考虑要部署到哪个环境。 因此,默认情况下,Visual Studio 项目模板使用从元素中删除debug属性compilation的代码创建 Web.Release.config 转换文件。 下面是默认的 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)" 属性指定要 debugsystem.web/compilation部署的 Web.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 应用程序还包括此类设置。 此设置控制网站页面上的可见指示器,告知你处于哪个环境,例如开发、测试或生产环境。 设置值确定应用程序是否会将“(Dev)”或“(Test)”追加到 Site.Master 母版页的主标题:

环境指示器

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

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

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

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

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

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

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

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

注意

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

设置连接字符串

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

总结

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

显示 Web.config 预览版的屏幕截图,左侧包含原始 Web.config 文件,以及转换后的 Web.config 文件在右侧的外观,其中突出显示了更改。

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

更多信息

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