在开发和生产环境中使用不同的 Web.config

Posted

技术标签:

【中文标题】在开发和生产环境中使用不同的 Web.config【英文标题】:Using different Web.config in development and production environment 【发布时间】:2010-09-23 06:09:48 【问题描述】:

我需要在我的 ASP.NET 应用程序中使用不同的数据库连接字符串和 SMTP 服务器地址,具体取决于它在开发或生产环境中运行。

应用程序通过WebConfigurationManager.AppSettings 属性从 Web.config 文件中读取设置。

我使用 Build/Publish 命令通过 FTP 将应用程序部署到生产服务器,然后手动将远程 Web.config 替换为正确的。

是否有可能以某种方式简化部署过程?谢谢!

【问题讨论】:

【参考方案1】:

您是否关注过网络部署项目?

http://www.microsoft.com/downloads/details.aspx?FamilyId=0AA30AE8-C73B-4BDD-BB1B-FE697256C459&displaylang=en

如果你不是 2008 的话,还有一个 VS2005 的版本。

【讨论】:

这是一个很好的使用 web 部署项目的指南:johnnycoder.com/blog/2010/01/07/… Web 部署项目现在似乎是 VS“发布配置文件”diaryofaninja.com/blog/2012/08/26/…【参考方案2】:

我也想知道。这有助于为我找出问题

然后我保留一个 connectionStrings.config 以及一个“host connectionStrings.config”。这仍然是一个问题,但如果您对两个环境中不同的部分执行此操作,您可以部署和版本相同的 web.config。

(顺便说一句,我不使用 VS。)

【讨论】:

如果您使用 VS,您可以使用 prebuild-events 从 debug.connectionstrings.config 或 release.connectionstrings.config 复制,例如: copy $(ProjectDir)$(ConfigurationName)ConnectionStrings.config $ (ProjectDir)ConnectionStrings.config 由 Scott 建议。汉塞尔曼:hanselman.com/blog/…【参考方案3】:

企业库配置编辑器可以帮助您做到这一点。它允许您创建一个基本配置文件,然后为每个环境创建增量。然后,您可以合并基本配置和增量以创建特定于环境的 web.config。看看here 的信息,它比我更能帮助你了解它。

【讨论】:

【参考方案4】:

您也可以将其作为构建后的步骤。除了调试和发布之外,设置一个“部署”的新配置,然后将构建后的步骤复制到正确的 web.config 上。

我们对所有项目都使用自动构建,并且构建脚本会更新 web.config 文件以指向正确的位置。但是,如果您在 VS 中做所有事情,那将无济于事。

【讨论】:

【参考方案5】:

我使用 NAnt 构建脚本来部署到我的不同环境。我让它根据部署到的位置通过 XPath 修改我的配置文件,然后使用 Beyond Compare 自动将它们放入该环境中。

设置需要一两分钟,但您只需设置一次。然后批处理文件接管,而我去拿另一杯咖啡。 :)

Here's我在上面找到的一篇文章。

【讨论】:

【参考方案6】:

这是使用 machine.config 的巨大好处之一。在我上一份工作中,我们有开发、测试和生产环境。我们可以将 machine.config 用于连接字符串(到适当的 dev/test/prod SQL 机器)之类的东西。

如果您无法访问实际的生产机器(例如,如果您在共享主机上使用托管公司),这可能不是您的解决方案。

【讨论】:

【参考方案7】:

在我们有 4 个环境(开发、测试、登台和生产)的一个项目中,我们开发了一个系统,其中应用程序根据部署到的机器名称选择适当的配置。

这对我们有用,因为:

管理员可以在不涉及开发人员的情况下部署应用程序(一项要求),也无需摆弄配置文件(他们讨厌这样做); 机器名称遵循约定。我们使用正则表达式匹配名称并部署到环境中的多台机器上;和 我们对连接字符串使用了集成安全性。这意味着我们可以在设计时将帐户名称保留在配置文件中,而无需泄露任何密码。

在这种情况下它对我们很有效,但可能不会在任何地方都有效。

【讨论】:

【参考方案8】:

web.config 中的<appSettings> 标记支持文件属性,该属性将使用自己的一组键/值加载外部配置。这些将覆盖您在 web.config 中的任何设置或添加到它们。

我们通过在安装时使用与站点安装环境相匹配的文件属性修改我们的 web.config 来利用这一点。我们通过安装程序的开关来做到这一点。

例如;

<appSettings file=".\EnvironmentSpecificConfigurations\dev.config">

<appSettings file=".\EnvironmentSpecificConfigurations\qa.config">

<appSettings file=".\EnvironmentSpecificConfigurations\production.config">

注意:

对属性指定的 .config 的更改不会触发 asp.net 工作进程的重新启动

【讨论】:

这是一个很好的答案,尤其是当您拥有大量环境并且某些环境的某些设置具有您不希望在源代码管理中跟踪的密码和类似内容时。 有动态改变文件路径的方法吗?根据您在哪个服务器上?顺便说一句,这是在一个旧的网站项目上工作,而不是一个 Web 应用程序。所以谢谢你! 有一个属性restartOnExternalChanges 会将这些文件视为web.configs。来源:learnable.com/books/…【参考方案9】:

在 Visual Studio 2010 及更高版本中,您现在可以根据构建配置对 web.config 应用转换。

创建web.config时,可以在解决方案资源管理器中展开该文件,会看到两个文件:

Web.Debug.Config Web.Release.Config

它们包含可用于的转换代码

更改连接字符串 删除调试跟踪和设置 注册错误页面

有关详细信息,请参阅 MSDN 上的 Web.config Transformation Syntax for Web Application Project Deployment。

尽管官方不支持,但也可以将相同类型的转换应用于非 Web 应用程序 app.config 文件。请参阅Phil Bolduc blog,了解如何修改项目文件以向 msbuild 添加新任务。

这是一个长期承受request on the Visual Studio Uservoice。

extension for Visual Studio 2010 及更高版本“SlowCheetah”可用于为任何配置文件创建转换。从 Visual Studio 2017.3 开始,SlowCheetah has been integrated into the IDE 和代码库由 Microsoft 管理。这个新版本还支持 JSON 转换。

【讨论】:

请注意,这不适用于旧网站 site 项目。仅适用于网络应用程序。我没有尝试查看 Phil Bolduc 的解决方法是否适用于网站,但我怀疑它不会,因为它们没有项目文件。 另请注意,web.confg 转换仅适用于 PUBLISHING,如果您只是构建/运行 F5,它们将不起作用:(((( 如果您的 web.config 不包含 Web.Debug.ConfigWeb.Release.Config,您可能需要右键单击 Web.Config 并单击 Add Config Transforms @Alex : 我们如何将它用于简单的构建/F5? 直接链接到SlowCheetah:marketplace.visualstudio.com/…【参考方案10】:

您也可以使用扩展“配置转换”与“SlowCheetah”一样工作,

【讨论】:

是的,它只在部署时有效,但在编译时无效,我希望我可以使用不同的配置转换环境简单地编译和调试

以上是关于在开发和生产环境中使用不同的 Web.config的主要内容,如果未能解决你的问题,请参考以下文章

调试/发布环境web.debug.config和web.release.config不存在

使用 Web.Config 转换的高级任务

一种Webconfig自动化升级方法

为开发和生产环境配置 CSS 中的图像路径

使用Web.Config Transformation配置灵活的配置文件

在部署环境之间管理复杂的 Web.Config 文件