25

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

网络配置

<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 教程,您仍然可以使用 Web.config。但config.json根据同一篇文章,现在似乎是处理配置的新方法:

配置文件

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

Startup.cs中:

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

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

4

3 回答 3

20

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);
于 2014-10-21T03:32:20.033 回答
4

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

代码

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

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

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

于 2015-04-01T08:54:22.773 回答
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");
}
于 2015-04-07T03:05:36.730 回答