2014-10-20 51 views
24

在ASP.NET中的许多人使用Web.Debug.config/Web.Release.config文件trasformations会是这个样子以前的版本:如何处理调试/释放配置转换在ASP.NET vNext

的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的处理config-transofrmation的建议方式是什么?

回答

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一个“设置1”,它会自动拿起“设置1”中qa.json

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

var envSpecificJson = configuration.Get("ENV") + ".json"; 
configuration.AddJsonFile(envSpecificJson); 
+0

的顺序优先级是“最后获胜”,所以使用这种方法时,你会说“默认为default.json中的值,用环境变量中的任何内容覆盖该值,并使用{envSpecificJson}中的任何内容覆盖该值。推荐的方法是让环境变量覆盖任何基于文件的配置值。默认模板现在使用: .AddJsonFile(“appsettings.json”,可选:true,reloadOnChange:true) .AddJsonFile($“appsettings。{env.EnvironmentName} .json”,可选:true,reloadOnChange:true) .AddEnvironmentVariables(); – 2016-08-31 01:40:55

3

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

代码

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

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

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

+8

如果有环境变量,你不需要省略'config.json',它将覆盖'config.json'上的那些变量,这是建议的连接字符串等工作流。 – 2015-04-07 19:50:46

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"); 
}