使用 Visual Studio 或 Visual Web Developer 通过SQL Server Compact部署 ASP.NET Web 应用程序:Web.Config文件转换 - 第 3 个,共 12 个

作者 :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 应用服务 Web 应用,请参阅使用 Visual Studio ASP.NET 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 部署参数。 你将配置一些转换,这些转换因所使用的生成配置而异,而某些转换因使用的发布配置文件而异。

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

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

Web.config_transform_files

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

你确实需要另外两个转换文件,用于配置与部署目标(而不是与生成配置)相关的更改。 此类设置的典型示例是测试与生产不同的 WCF 终结点。 在后面的教程中,你将创建名为“测试和生产”的发布配置文件,因此需要 一个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 包 进行错误日志记录和报告。 customErrorsWeb.config 文件中的 元素指定错误页:

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

若要查看错误页,请暂时将modecustomErrors元素的 属性从“RemoteOnly”更改为“On”,并从 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 添加 元素,而不添加此处显示的周围标记,只是为了提供一些 context.)

<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 母版页中的main标题:

Environment_indicator

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

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

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

在测试环境中,该值应为“Test”,在生产环境中应为“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的元素。 元素的唯一另一 add 个属性是 value,这是将在部署 的Web.config 文件中更改的内容。 此代码会导致value在部署到生产的 Web.config 文件中将 元素的 EnvironmentappSettings 属性设置为“Prod”。

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

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

禁用调试模式

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

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

每当部署发布版本时, debug 属性Transform都会使已部署的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转换方案。