使用 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.config和Web.Release.config转换文件。
可以通过右键单击Web.config文件并从上下文菜单中选择 “添加配置转换 ”,为自定义生成配置创建转换文件,但对于本教程,无需执行此操作。
你确实需要另外两个转换文件,用于配置与部署目标(而不是与生成配置)相关的更改。 此类设置的典型示例是测试与生产不同的 WCF 终结点。 在后面的教程中,你将创建名为“测试和生产”的发布配置文件,因此需要 一个Web.Test.config 文件和 一个Web.Production.config 文件。
必须手动创建与发布配置文件绑定的转换文件。 在“解决方案资源管理器”中,右键单击“ContosoUniversity”项目,然后选择“在 Windows 资源管理器中打开文件夹”。
在 Windows 资源管理器中,选择 Web.Release.config 文件,复制该文件,然后粘贴它的两个副本。 将这些副本重命名 Web.Production.config 并 Web.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”更改为“On”,并从 Visual Studio 运行应用程序。 通过请求无效 URL(例如 Studentsxxx.aspx)导致错误。 你会看到 GenericErrorPage.aspx 页,而不是 IIS 生成的“找不到页”错误页。
若要查看错误日志,请将端口号后 URL 中的所有内容替换为屏幕截图中示例的 elmah.axd (, http://localhost:51130/elmah.axd
) 然后按 Enter:
完成后,不要忘记将 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>
“Transform
Insert”的属性值导致此location
元素作为同级添加到Web.config文件中的任何现有location
元素。 (已有一个 location
元素指定“ 更新额度 ”页的授权规则。) 部署后测试生产站点时,将进行测试以验证此授权规则是否有效。
无需在测试环境中限制错误日志访问,因此不必将此代码添加到 Web.Test.config 文件。
注意
安全说明 切勿在生产应用程序中向公众显示错误详细信息,或将这些信息存储在公共位置。 攻击者可以使用错误信息来发现站点中的漏洞。 如果在自己的应用程序中使用 ELMAH,请务必调查配置 ELMAH 以最大程度地降低安全风险的方法。 不应将本教程中的 ELMAH 示例视为建议的配置。 选择此示例是为了说明如何处理应用程序必须能够在其中创建文件的文件夹。
设置环境指示器
一种常见方案是 Web.config文件设置 ,这些设置在部署到的每个环境中必须不同。 例如,调用 WCF 服务的应用程序可能需要在测试和生产环境中使用不同的终结点。 Contoso University 应用程序还包括此类设置。 此设置控制站点页面上的可见指示器,指示你处于哪个环境,例如开发、测试或生产环境。 设置值确定应用程序是将“ (Dev) ”还是“ (Test) ”追加到 Site.Master 母版页中的main标题:
当应用程序在生产环境中运行时,将省略环境指示器。
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 文件中将 元素的 Environment
appSettings
属性设置为“Prod”。
接下来,将相同的更改应用于 Web.Test.config 文件,只不过将 设置为 value
“Test”而不是“Prod”。 完成后, appSettings
Web.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转换方案。
反馈
https://aka.ms/ContentUserFeedback。
即将发布:在整个 2024 年,我们将逐步淘汰作为内容反馈机制的“GitHub 问题”,并将其取代为新的反馈系统。 有关详细信息,请参阅:提交和查看相关反馈