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


194

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

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

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

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

Answers:


159

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

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

  • Web.Debug.Config
  • Web.Release.Config

它们包含可用于

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

有关更多信息,请参见用于 MSDN上的Web应用程序项目部署的Web.config转换语法

尽管没有官方支持,也可以对非Web应用程序app.config文件进行相同类型的转换。有关如何修改项目文件以向msbuild添加新任务的信息,请参见Phil Bolduc博客

这是对Visual Studio Uservoice的长期要求

Visual Studio 2010及更高版本的扩展SlowCheetah ”可用于为任何配置文件创建转换。从Visual Studio 2017.3开始,SlowCheetah已集成到IDE中,并且代码库由Microsoft管理。此新版本还支持JSON转换。


7
请注意,这不适用于旧的网站项目。仅适用于Web 应用程序。我没有尝试查看Phil Bolduc的变通方法是否适用于网站,但是我怀疑它不会,因为它们没有项目文件。
莫。

13
另请注意,web.confg转换仅适用于发布,如果您仅构建/运行F5则它们无效:(((
Alex

7
如果您的web.config不包含Web.Debug.ConfigWeb.Release.Config,则可能需要右键单击Web.Config并单击Add Config Transforms
Doug S

1
@Alex:如何将其用于简单的构建/ F5?
punter

1
:直接链接到SlowCheetah marketplace.visualstudio.com/...

83

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

我们通过在安装时使用与站点安装环境相匹配的文件属性修改web.config来利用此优势。我们通过在安装程序上进行切换来实现。

例如;

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

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

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

注意:

  • 通过属性指定的.config更改不会触发asp.net worker进程的重新启动

2
这是一个很好的答案,尤其是当您有大量环境并且某些环境的某些设置包含密码以及您不希望在源代码管理中跟踪的类似内容时。
菲尔

1
有动态的方式更改文件路径吗?您基于哪个服务器?请注意,这是在旧的网站项目上工作的,而不是在Web应用程序上工作。所以谢谢!
透视

2
有一个属性restartOnExternalChanges会将这些文件视为web.configs。资料来源:learnable.com/books/…–
David Schwartz,


13

我也想知道。这有助于为我隔离问题

<connectionStrings configSource =“ connectionStrings.config” />

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

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


如果您使用的是VS,则可以使用prebuild-events从debug.connectionstrings.config或release.connectionstrings.config复制,如:复制$(ProjectDir)$(ConfigurationName)ConnectionStrings.config $(ProjectDir)ConnectionStrings.config由斯科特。Hanselmann:hanselman.com/blog/…–
Thomas

6

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

只需花一两分钟即可完成设置,但只需执行一次。然后批处理文件接管,而我又去喝杯咖啡。:)

这是我在上面找到的一篇文章。


5

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

这对我们有用,因为:

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

在这种情况下,它对我们来说效果很好,但可能不会在所有地方都起作用。


3

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


3

您也可以将其设为构建后步骤。设置除调试和发行版外的新配置“ Deploy”,然后将构建后步骤复制到正确的web.config上。

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


3

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

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


1

您也可以使用扩展名“ Configuration Transform”与“ SlowCheetah”相同,


是的,它可以工作,但仅在部署时有效,而不能在编译时有效,我希望我可以使用不同的配置转换环境简单地进行编译和调试
Ch'nycos
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.