使用asp.net基于不同的服务器更新web.config

时间:2010-12-03 23:44:29

标签: asp.net variables web-config environment-variables

我正在寻找一个简单的& amp;基于不同的环境改变我在web.config中的appsettings的优雅方式,我有(dev / qa / test / stage / prod),我手动更改appsettings及其非常繁琐和时间消费,我有几十个设置......对于这种情况,最好的方法是什么?我知道使用Environment variables的一个解决方案,但想听听最佳实践吗?

8 个答案:

答案 0 :(得分:2)

如果可能,请将您的应用升级到asp.net 4。

此版本具有web.config转换功能,旨在解决此问题:

答案 1 :(得分:1)

我通常会做以下事情:

  1. 包含每个配置值的多个版本,每个环境一个
  2. 创建一个小班来阅读我的应用设置。在此类中,创建一个检测当前环境的函数。
  3. 对于每个设置,创建一个具有开关的访问者属性,该开关使用环境检测功能来确定要返回的值。
  4. 它需要一些初始设置,但一旦配置,它提供了一种简单而无忧的方法来获取配置值。

答案 2 :(得分:1)

如果您使用VS2010(NET工具版本4),那么您可以进行Web配置转换并构建部署包以部署到暂存,生产等。无论您的asp.net目标版本是什么都无关紧要。然后部署包和tada,您将在目标上安装自定义配置文件。无需运行时间来弄明白。我一直这样做,使用3.5作为我的目标版本的.NET使用MSBuild 4,VS2010使用。我的开发环境具有与我的生产和登台环境不同的应用程序设置。

答案 3 :(得分:1)

最终,如果可能,我建议在Visual Studio 2010中使用Web.config Transformation功能。

如果VS2010不是一个选项,或者你不想使用配置转换功能,请看一下我刚才提出的这个解决方案。它使用批处理文件和NANT脚本的组合,从单个模板和一个或多个替换文件生成配置文件。它没有Web.config转换工具那么强大,但它是一个非常有效的替代方案。

http://blog.nathan-taylor.net/2009/10/webconfig-build-manager.html

答案 4 :(得分:1)

在VS2010之前,我们实际上命名了我们的web.prod.config,web.qa.config等。我想我们有一些很棒的远景。

无论如何,在VS2008下我们有一个复制命令,它作为构建步骤的一部分执行,将根据我们构建的配置复制相应的配置文件。我们的常规web.config指向dev,我们使用TFS部署到其他环境。

答案 5 :(得分:1)

我更喜欢使用web.config的外化部分,如下所示:

<appSettings configSource="appsettings.config" />

然后appsettings.config看起来像这样:

<appSettings>
   <add key ...>
</appSettings>

这允许我将应用程序设置保存在不会更改的单独文件中,同时仍允许我编辑实际配置部分的主web.conifig。 您可以对其他部分执行相同的操作 - 连接字符串,system.net(用于电子邮件配置)等。

我实际上并不认为VS2010方式非常好,因为它需要重新构建才能更改配置。按照我的方式,它可以在没有VS的情况下使用,所以我可以轻松地手动修改我的所有环境。

答案 6 :(得分:0)

我们使用Nant编写构建和部署脚本。

Nant会将web.config和app.config模板复制到项目文件所期望的位置。同时,Nant用QA环境的适当值替换标记。

答案 7 :(得分:0)

我知道你已经接受了答案,但我根据不同的环境使用不同的配置文件的方法,并命名为这样。

例如,我有appsettings.config.debug,appsettings.config.deploy,web.config.debug,web.config.deploy。

然后,我有一个预构建脚本,它运行批处理文件,将与当前配置设置相关的配置文件复制到没有配置设置后缀的文件中。只有使用FC时文件不同才会执行此操作。

我的预构建事件命令行代码是:

"$(ProjectDir)copyifnewer.bat" "$(ProjectDir)web.config.$(ConfigurationName)" "$(ProjectDir)web.config"

"$(ProjectDir)copyifnewer.bat" "$(ProjectDir)appsettings.config.$(ConfigurationName)" "$(ProjectDir)appsettings.config"

我的copyifnewer.bat文件是:

echo Config Maintenance
echo Today's date of %date:~-4,4%\%date:~-10,2%\%date:~-7,2%
rem echo Comparing two files: %1 with %2
echo .
if not exist %1 goto File1NotFound
if not exist %2 goto File2NotFound

fc %1 %2 
if %ERRORLEVEL%==0 GOTO NoCopy

echo These files are NOT the same.  Copying %1 over %2
copy %1 %2 /y & goto END

:NoCopy
echo These files are the same.  Nothing copied.
goto END

:File1NotFound
echo %1 not found.
goto END

:File2NotFound
copy %1 %2 /y
goto END

:END
echo Done.
echo .

这对我很有用。希望这有助于某人。

谢谢, 斯科特