1.前言 ASP.NET Core在應用程式上引入Microsoft.Extensions.Configuration配置,可以支持多種方式配置,包括命令行配置、環境變數配置、文件配置、記憶體配置,自定義配置等等。下麵我們就其中幾個配置來聊聊。 2.命令行配置 CommandLineConfigura ...
1.前言
ASP.NET Core在應用程式上引入Microsoft.Extensions.Configuration配置,可以支持多種方式配置,包括命令行配置、環境變數配置、文件配置、記憶體配置,自定義配置等等。下麵我們就其中幾個配置來聊聊。
2.命令行配置
CommandLineConfigurationProvider在應用程式運行時會從(例如DOS)命令行參數鍵值載入配置。要激活命令行配置,請在ConfigurationBuilder的實例上調用AddCommandLine擴展方法。使用CreateDefaultBuilder初始化新的WebHostBuilder時會自動調用AddCommandLine。
public class Program { public static void Main(string[] args) { CreateWebHostBuilder(args).Build().Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .ConfigureAppConfiguration((hostingContext, config) => { // Call other providers here and call AddCommandLine last. config.AddCommandLine(args); }).UseStartup<Startup>(); }
在Program加入上述代碼併在/Home/Index視圖上添加如下代碼後發佈一個Web版本掛載在IIS上。
在控制臺上輸入DOS命令行dotnet D:\Release\Core\TestWebApp.dll CommandLineKey1=value1配置鍵:CommandLineKey1,值:value1的信息,會看到如下界面信息:
根據控制台監聽站點連接,在瀏覽器上打開其中一個,比如打開https://localhost:5001/,會看到我們配置命令行信息:
3.文件配置
FileConfigurationProvider是從文件系統載入配置的基類。以下配置為應用程式提供專用於特定文件類型:INI配置、JSON配置、XML配置。
3.1 INI配置
IniConfigurationProvider在運行時會從INI文件鍵值對載入配置。若要激活INI文件配置,請在 ConfigurationBuilder的實例上調用AddIniFile擴展方法,而冒號可用作INI文件配置中的節點分隔符。現在我們在CoreWeb根目錄下添加一個INI配置文件(命名為config):
[section0] key0=value key1=value [section1] subsection:key=value [section2:subsection0] key=value [section2:subsection1] key=value
而應用程式在構建主機時會調用ConfigureAppConfiguration以指定應用程式配置(這裡我們指定config.ini文件):
public class Program { public static void Main(string[] args) { CreateWebHostBuilder(args).Build().Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .ConfigureAppConfiguration((hostingContext, config) => { config.SetBasePath(Directory.GetCurrentDirectory()); config.AddIniFile( "config.ini", optional: true, reloadOnChange: true); }) .UseStartup<Startup>(); }
從上述代碼可以看到IConfigurationBuilder設置了文件訪問初始路徑。Optional:文件是否可選;reloadOnChange:如果文件更改,是否應重新載入配置。而通過啟動應用程式時會看到如下配置信息:
3.2 JSON配置
JsonConfigurationProvider在運行時期間會從JSON文件鍵值對載入配置。若要激活JSON文件配置,請在ConfigurationBuilder的實例上調用AddJsonFile擴展方法。使用 CreateDefaultBuilder初始化新的WebHostBuilder時,會自動調用AddJsonFile兩次,調用該方法(AddJsonFile)來從以下文件載入配置,首先會讀取appsettings.json該文件。而應用程式啟動時是會預設調用對應的appsettings.{Environment}.json環境版本的,例如appsettings.{Environment}.json會根據IHostingEnvironment.EnvironmentName載入對應文件的環境版本(開發模式、生產模式等)。現在我們在CoreWeb根目錄下添加一個JSON配置文件(命名為config):
{ "section0": { "key0": "key0value", "key1": "key1value" }, "section1": { "key0": "key0value", "key1": "key1value" }, "section2": { "subsection0": { "key0": "sub0key0value", "key1": "sub0key1value" }, "subsection1": { "key0": "sub1key0value", "key1": "sub1key1value" } } }
而應用程式在構建主機時會調用ConfigureAppConfiguration以指定除appsettings.json和appsettings.{Environment}.json以外文件的應用程式配置(這裡我們指定config.json文件):
public class Program { public static void Main(string[] args) { CreateWebHostBuilder(args).Build().Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .ConfigureAppConfiguration((hostingContext, config) => { config.SetBasePath(Directory.GetCurrentDirectory()); config.AddJsonFile( "config.json", optional: true, reloadOnChange: true); }) .UseStartup<Startup>(); }
而通過啟動應用程式時會看到如下配置信息:
從上述信息可以看到,在我們指定config.json文件後,IConfigurationBuilder會額外多調用一次AddJsonFile,加上前兩次AddJsonFile,一共是三次。
3.2.1GetSection、GetChildren和Exists
(1)GetSection:IConfiguration.GetSection獲取指定配置子節。下麵我們通過一個示例來瞭解下:
public Startup(IConfiguration configuration) { Configuration = configuration; var configSection0 = Configuration.GetSection("section0"); var configSection1 = Configuration.GetSection("section0:key0"); }
而通過啟動應用程式時會看到如下配置信息:
通過上述示例可以看到,IConfiguration.GetSection僅僅是獲取到json數據裡面configSection0節點鍵和路徑,並沒有獲取到它的節點值。若要獲取section0:key0中的鍵值,請在調用GetSection時提供完整節點路徑,如獲取configSection1鍵值示例。
(2)GetChildren:獲取指定配置樹節點。下麵我們通過一個示例來瞭解下:
public Startup(IConfiguration configuration) { Configuration = configuration; var configSection = Configuration.GetSection("section2"); var children = configSection.GetChildren(); }
而通過啟動應用程式時會看到如下配置信息:
GetChildren獲取了指定section2節點下所有節點。
(3)Exists:使用ConfigurationExtensions.Exists確定配置節點是否存在。下麵我們通過一個示例來瞭解下:
public Startup(IConfiguration configuration) { Configuration = configuration; var sectionExists0 = Configuration.GetSection("section2").Exists();//true var sectionExists1 = Configuration.GetSection("section2:subsection2").Exists();//false }
而通過啟動應用程式時會瞭解到section2配置節點如果存在就會返回true,反之則false;同理section2:subsection2路徑配置節點亦一樣。
3.3 XML配置
XmlConfigurationProvider在運行時會從XML文件鍵值對載入配置。若要激活XML文件配置,請在ConfigurationBuilder的實例上調用AddXmlFile擴展方法。現在我們在CoreWeb根目錄下添加一個XML配置文件(命名為config):
<?xml version="1.0" encoding="utf-8" ?> <configuration> <section0> <key0>value</key0> <key1>value</key1> </section0> <section1> <key0>value</key0> <key1>value</key1> </section1> </configuration>
而應用程式在構建主機時調用ConfigureAppConfiguration以指定應用程式的配置(這裡我們指定config.xml文件):
public class Program { public static void Main(string[] args) { CreateWebHostBuilder(args).Build().Run(); } public static IWebHostBuilder CreateWebHostBuilder(string[] args) => WebHost.CreateDefaultBuilder(args) .ConfigureAppConfiguration((hostingContext, config) => { config.SetBasePath(Directory.GetCurrentDirectory()); config.AddXmlFile( "config.xml", optional: true, reloadOnChange: true); }) .UseStartup<Startup>(); }
而通過啟動應用程式時會看到如下配置信息:
參考文獻:
ASP.NET Core 中的配置