使用 Visual Studio 或 Visual Web 开发人员通过 SQL Server Compact 部署 ASP.NET Web 应用程序:Web.Config 文件转换 - 12 个中的 3 个

作者:Tom Dykstra

下载初学者项目

本系列教程介绍如何使用 Visual Studio 2012 RC 或 Visual Studio Express 2012 RC for Web 部署包含 SQL Server Compact 数据库的 ASP.NET Web 应用程序项目。 如果安装 Web 发布更新,也可以使用 Visual Studio 2010。 有关该系列的简介,请参阅 该系列中的第一个教程。

有关演示 Visual Studio 2012 RC 版本之后引入的部署功能的教程,演示如何部署 SQL Server Compact 以外的 SQL Server 版本,以及如何部署到Azure App 服务 Web 应用,请参阅使用 Visual Studio ASP.NET 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 部署参数。 你将根据所使用的生成配置配置来配置一些转换,以及一些转换因使用的发布配置文件而异。

为发布配置文件创建转换文件

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

Web.config_transform_files

可以通过右键单击 Web.config 文件并选择上下文菜单中的 “添加配置转换”,为自定义生成配置创建转换 文件,但对于本教程,无需执行此操作。

需要另外两个转换文件,用于配置与部署目标(而不是生成配置)相关的更改。 此类设置的典型示例是测试与生产环境不同的 WCF 终结点。 在后面的教程中,你将创建名为 Test 和 Production 的发布配置文件,因此需要 Web.Test.config 文件和 Web.Production.config 文件。

必须手动创建绑定到发布配置文件的转换文件。 在解决方案资源管理器中,右键单击 ContosoUniversity 项目,然后在 Windows 资源管理器中选择“打开文件夹”。

Open_folder_in_Windows_Explorer

Windows 资源管理器中,选择 Web.Release.config 文件,复制该文件,然后粘贴其中两个副本。 重命名这些副本 Web.Production.configWeb.Test.config,然后关闭 Windows 资源管理器

解决方案资源管理器中,单击“刷新以查看新文件。

选择新文件,右键单击,然后单击上下文菜单中的“ 包含在项目中 ”。

在项目中包括测试和生产配置文件

若要防止部署这些文件,请在解决方案资源管理器中选择这些文件,然后在“属性”窗口中将“生成操作属性从“内容”更改为“无”。 (基于生成配置的转换文件会自动阻止部署。

现在可以将 Web.config 转换输入到 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 生成的“找不到页”错误页。

Error_page

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

Elmah_log_page

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

在开发计算机上,允许免费访问错误日志页,但在生产环境中,这是一个安全风险。 对于生产站点,可以通过在 Web.Production.config 文件中配置转换来添加一个授权规则,该规则仅限制对管理员的错误日志访问。

打开 Web.Production.config,并在打开configuration标记后立即添加新location元素,如下所示。 (请确保仅 location 添加元素而不是此处显示的周围标记,以便提供一些上下文。

<configuration xmlns:xdt="http://schemas.microsoft.com/XML-Document-Transform">
    <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.Test.config 文件。

注意

安全说明 永远不会在生产应用程序中向公众显示错误详细信息,或将该信息存储在公共位置。 攻击者可以使用错误信息来发现站点中的漏洞。 如果在自己的应用程序中使用 ELMAH,请务必调查可配置 ELMAH 以最大程度地降低安全风险的方式。 本教程中的 ELMAH 示例不应被视为建议的配置。 这是一个示例,为了说明如何处理应用程序必须能够在其中创建文件的文件夹。

设置环境指示器

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

Environment_indicator

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

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

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

该值应为测试环境中的“测试”,在生产环境中应为“Prod”。

打开 Web.Production.config,并在前面添加的location元素的开始标记之前添加元素appSettings

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

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

接下来,对 Web.Test.config 文件应用相同的更改,但设置为value“Test”而不是“Prod”。 完成后,appSettingsWeb.Test.config 中的部分将如以下示例所示:

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

禁用调试模式

对于发布版本,无论部署到哪个环境,都不希望启用调试。 默认情况下, Web.Release.config 转换文件是使用从元素中删除 debug 属性 compilation 的代码自动创建的:

<system.web>
  <compilation xdt:Transform="RemoveAttributes(debug)" />
</system.web>

每当部署发布版本时,该 Transform 属性都会 debug 从部署 的 Web.config 文件中省略该属性。

此同一转换位于测试和生产转换文件中,因为你通过复制发布转换文件创建了这些文件。 不需要复制该文件,因此请打开其中每个文件,删除 编译 元素,然后保存并关闭每个文件。

设置连接字符串

在大多数情况下,无需设置连接字符串转换,因为可以在发布配置文件中指定连接字符串。 但是,部署 SQL Server Compact 数据库并使用Entity Framework Code First 迁移更新目标服务器上的数据库时,会出现异常。 对于此方案,必须指定将在服务器上用于更新数据库架构的其他连接字符串。 若要设置此转换,请在 Web.Test.config 和 Web.Production.config 转换文件中打开<配置>标记后立即添加< connectionStrings> 元素:

<connectionStrings>
  <add name="SchoolContext_DatabasePublish" connectionString="Data Source=|DataDirectory|School-Prod.sdf" providerName="System.Data.SqlServerCe.4.0" xdt:Transform="Insert"/>
</connectionStrings>

Transform属性指定此连接字符串将添加到部署的 Web.config 文件中的 connectionStrings 元素。 (如果它不存在,则发布过程会自动为你创建此附加连接字符串,但默认情况下,providerName 属性设置为System.Data.SqlClient不适用于 SQL Server Compact。通过手动添加连接字符串,使部署过程无法创建具有错误提供程序名称的连接字符串元素。

现在,你已指定 部署 Contoso University 应用程序以测试和生产所需的所有 Web.config 转换。 在以下教程中,你将负责需要设置项目属性的部署设置任务。

更多信息

有关本教程涵盖的主题的详细信息,请参阅 ASP.NET 部署内容映射中的 Web.config 转换方案。