【问题标题】:How to handle debug/release config transformations in ASP.NET vNext如何在 ASP.NET vNext 中处理调试/发布配置转换
【发布时间】:2014-12-15 14:31:05
【问题描述】:

在以前的 ASP.NET 版本中,我们中的许多人使用 Web.Debug.config/Web.Release.config 文件转换,看起来像这样:

Web.config

<connectionStrings>
  <add name="AppDB" connectionString="Data Source=(LocalDb)\\..." />
</connectionStrings>

Web.Release.config

<connectionStrings>
  <add name="AppDB" connectionString="Data Source=(ReleaseDb)\\..."  xdt:Transform="SetAttributes" xdt:Locator="Match(name)"/>
</connectionStrings>

根据ASP.NET vNext tutorial,您仍然可以使用 Web.config。但是根据同一篇文章,config.json 似乎是现在处理配置的新方法:

config.json

{
    "Data": {
        "DefaultConnection": { 
            "ConnectionString": "Server=(localdb)\\..."
        }
    }
}

Startup.cs 中:

var configuration = new Configuration();
configuration.AddJsonFile("config.json");
configuration.AddEnvironmentVariables();

所以我想知道通过这种转变为 json 来处理配置转换的建议方法是什么?

【问题讨论】:

    标签: asp.net web-config config release asp.net-core


    【解决方案1】:

    vNext 使用新的配置系统,您可以在其中通过代码读取环境变量。因此,在这种情况下,您将检查是否存在适当的环境变量并通过代码包含相应的 JSON。

    例如,您可以创建 qa.json 和 prod.json。设置一个环境变量,例如,“ENV”,它指向相应环境中的“qa”和“prod”。然后可以有条件地添加适当的 JSON。

    代码可能如下所示:

    1) default.json 包含你所有的默认内容。

    2) qa.json 和 prod.json 包含必要的覆盖。

    3) 由于 qa.json 和 prod.json 来得较晚,所以他们会赢。如果default.json和qa.json中有“setting1”,会自动拾取qa.json中的“setting1”

     var configuration = new Configuration()
                         .AddJsonFile("default.json")
                         .AddEnvironmentVariables(); 
    
     var envSpecificJson = configuration.Get("ENV") + ".json";
     configuration.AddJsonFile(envSpecificJson);
    

    【讨论】:

    • 优先顺序是“最后获胜”,所以使用这种方法,您说的是“默认为 default.json 中的值,用在环境变量中找到的任何内容覆盖它,然后覆盖它{envSpecificJson} 中的任何内容。”推荐的方法是让环境变量覆盖任何基于文件的配置值。默认模板现在使用: .AddJsonFile("appsettings.json", optional: true, reloadOnChange: true) .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true) .AddEnvironmentVariables( );
    【解决方案2】:

    默认情况下,ASP.NET 将检查名为“ASPNET_ENV”的环境变量来设置 IHostingEnvironment 的 EnvironmentName 变量。

    相关代码可以看这里:

    https://github.com/aspnet/Hosting/blob/77e2dc263f11655312d4c73bb8e22d7b6254d485/src/Microsoft.AspNet.Hosting/HostingFactory.cs

    如果您在各种环境的服务器上更改 ASPNET_ENV 的值,您可以执行以下操作:

    var configuration = new Configuration()
                .AddJsonFile("config.json")
                .AddEnvironmentVariables();
    if (string.Equals(env.EnvironmentName, "Prod", StringComparison.OrdinalIgnoreCase))
    {
                configuration.AddJsonFile("prod.config.json");
    }
    

    【讨论】:

      【解决方案3】:

      虽然前面的答案提供了一个很好的解决方案,但我想提出一个替代方案:

      代码

      var configuration = new Configuration()
                           .AddJsonFile("config.json")
                           .AddEnvironmentVariables();
      

      本地环境: 这里有包含所有设置的“config.json”文件。它易于编辑和维护。

      生产环境: 部署时省略“config.json”文件。由于缺少它,代码将在链中寻找下一个源,即环境变量。因此,在本地计算机上时,请使用配置文件。在服务器上时,回退到环境变量。请注意,配置键显然必须在文件和环境变量中命名相同。

      【讨论】:

      • 如果存在环境变量,则无需省略 config.json,它将覆盖 config.json 上的变量,这是连接字符串等推荐的工作流程。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-09-05
      • 1970-01-01
      • 2017-05-07
      • 2016-07-17
      • 1970-01-01
      • 2011-04-27
      • 1970-01-01
      相关资源
      最近更新 更多