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

Ale*_*yev 189 asp.net configuration web-config visual-studio

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

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

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

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

Pie*_*ant 155

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

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

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

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

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

有关详细信息,请参阅MSDN上的Web应用程序项目部署的Web.config转换语法.

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

这是对Visual Studio Uservoice的长期保留请求.

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

  • 另请注意,web.confg仅转换PUBLISHING的工作,如果您只是构建/运行F5它们不起作用:(((( (12认同)
  • 请注意,这不适用于旧的web**site**项目.仅适用于web**应用程序**.我没有试过看Phil Bolduc的解决方法是否适用于网站,但我怀疑它不会,因为它们没有项目文件. (7认同)
  • 如果你的web.config不包含`Web.Debug.Config`和`Web.Release.Config`,你可能需要右键单击`Web.Config`并单击`Add Config Transforms`. (7认同)
  • @Alex:我们如何使用它进行简单构建/F5? (2认同)

Jas*_*omb 80

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

我们通过在安装时修改web.config并使用与安装站点的环境相匹配的文件属性来利用此功能.我们通过安装程序开关来完成此操作.

例如;

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

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

<appSettings file=".\EnvironmentSpecificConfigurations\production.config">
Run Code Online (Sandbox Code Playgroud)

注意:

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

  • 这是一个很好的答案,特别是当您拥有大量环境并且某些环境的某些设置具有您不希望在源代码管理中跟踪的密码和类似设置时. (2认同)
  • 有没有动态更改文件路径的方法?基于您所在的服务器?附带说明一下,这是在旧网站项目上运行,而不是 Web 应用程序。所以谢谢! (2认同)
  • 有一个属性`restartOnExternalChanges`,它将这些文件视为web.configs.资料来源:https://learnable.com/books/the-asp-net-2-0-anthology-101-essential-tips-tricks-hacks/preview/how-can-i-simplify-my-web-config-文件a64852b (2认同)

小智 24

您是否已查看过Web部署项目?

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

如果您不在2008年,还有VS2005的版本.


har*_*rpo 12

我也想知道.这有助于我解决问题

<connectionStrings configSource="connectionStrings.config"/>

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

(而且我不使用VS,顺便说一句.)


Jef*_*don 6

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

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

这是我在其上发现的一篇文章.


dar*_*iom 5

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

这对我们有用,因为:

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

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