1. 程式人生 > >(11)ASP.NET Core 中的配置一(Configuration)

(11)ASP.NET Core 中的配置一(Configuration)

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 中的