【问题标题】:update web.config based on different server using asp.net使用 asp.net 根据不同的服务器更新 web.config
【发布时间】:2010-12-03 23:44:29
【问题描述】:

我正在寻找一种简单而优雅的方法来根据不同的环境在 web.config 中更改我的appsettings,并且我有(dev/qa/test/stage/prod)并且我正在手动更改appsettings它非常乏味和耗时,我有大约几十种设置....这种情况的最佳方法是什么?我知道使用Environment variables 的一种解决方案,但想听听最佳做法?

【问题讨论】:

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


    【解决方案1】:

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

    <appSettings configSource="appsettings.config" />
    

    那么 appsettings.config 看起来像这样:

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

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

    我其实不认为VS2010的方式很好,因为它需要重新构建只是为了改变配置。以我的方式,它完全可以在没有 VS 的情况下使用,所以我可以轻松地手动修改我的所有环境。

    【讨论】:

    • 这更多是关于将安装特定设置与所有安装的通用设置分开
    【解决方案2】:

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

    这个版本有一个 web.config 转换功能,旨在解决这个问题:

    【讨论】:

    • 我正在使用 VS2010,但我们的产品服务器仍然是 3.5,所以我必须针对 3.5 框架。
    • 嗯,如果您需要推出自己的解决方案,那么(这是一个长镜头)您也许可以将 web.config 转换功能从 NuGet 项目中提取出来:haacked.com/archive/2010/11/19/nuget-transformation.aspx
    • @rtpHarry, @Chicagoland:您仍然可以在面向 .NET 3.5 时使用 web.config 转换。该功能只需要您使用 VS2010。
    • 这个功能用起来真的很烦人,VS2010中的web.config转换有什么替代品吗?
    • @Nathan 我不知道,必须检查一下,谢谢
    【解决方案3】:

    我通常会做以下事情:

    1. 包括每个配置值的多个版本,每个环境一个版本
    2. 创建一个小班来阅读我的应用程序设置。在这个类中,创建一个检测当前环境的函数。
    3. 为每个设置创建一个访问器属性,该属性具有一个开关,该开关使用环境检测功能来确定要返回的值。

    它需要一些初始设置,但一旦配置完成,它提供了一种简单且无忧的获取配置值的方法。

    【讨论】:

    • 我理解你的概念,但我有一个问题,所以假设我有web.config-devweb.config-qaweb.config-prod,我有一个函数可以返回我在哪个环境中并假设我我在qa box 所以我读什么/如何读web.config-qa 如果你已经完成了,你能给我看一些示例代码吗?
    • 我不会更改文件名的 .config 部分...然后它可能会被下载(因为 .config 文件受到保护)...可能是 dev.config 或 prod.config
    【解决方案4】:

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

    【讨论】:

    • 请记住,在您的项目文件中,目标可以是 3.5、2.0 等... $MSBuildPath = "$($(gp -Path HKLM:\Software\Microsoft\'NET Framework Setup'\NDP \v4\full).InstallPath)MSBuild.exe" .$MSBuildPath $ProjectFile /T:Package /ToolsVersion:4.0 /p:Configuration=Release
    【解决方案5】:

    最后,我建议尽可能使用 Visual Studio 2010 中的 Web.config 转换功能。

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

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

    【讨论】:

      【解决方案6】:

      在 VS2010 之前,我们实际上将我们的命名为 web.prod.config、web.qa.config 等。我想我们有一些很好的先见之明。

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

      【讨论】:

        【解决方案7】:

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

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

        【讨论】:

          【解决方案8】:

          我知道你已经接受了一个答案,但是我使用了根据不同环境拥有不同配置文件的方法,并以此命名。

          例如,我有 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 .
          

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

          谢谢, 斯科特

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-02-14
            • 1970-01-01
            • 2020-05-09
            • 2019-06-29
            • 1970-01-01
            • 2011-01-09
            相关资源
            最近更新 更多