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