更新ASP.NET Core後,配置的讀取是第一個要明确的技術。原先的App.Config、Web.Config、自定義Config在ASP.NET Core中如何正常使用。有必要好好總結整理一下,相信大家都會用到。
首先,看一下ASP.NET Core中的配置提供程式(Configuration Providers):
一、配置提供程式(Configuration Providers)
ASP.NET Core 使用一個或多個配置提供程式來讀取配置:
- 應用程式設定檔案(配置檔案),例如appsettings.json
- 環境變量:Environment variables
- 指令行參數:Command-line arguments
- 自定義的配置提供程式
- 目錄檔案
- 記憶體中的.NET對象(記憶體中的配置類)
- Azure Key Vault,詳細說明參考這個連接配接:https://docs.microsoft.com/en-us/aspnet/core/security/app-secrets?view=aspnetcore-3.0&tabs=windows
- Azure應用程式配置:Azure App Configuration
我們通過下面的代碼,輸出配置提供程式的加載順序:
var configRoot = (IConfigurationRoot)Configuration;
foreach (var provider in configRoot.Providers.ToList())
{
Debug.WriteLine(provider.ToString() + "\n");
}
輸出有5個:
- Microsoft.Extensions.Configuration.ChainedConfigurationProvider:鍊式的配置提供程式,可以添加已有的IConfiguration,作為一個配置源
- JsonConfigurationProvider for 'appsettings.json' (Optional):讀取appsettings.json檔案
- JsonConfigurationProvider for 'appsettings.Development.json' (Optional):按環境讀取不同的appsettings.json檔案,例如appsettings.Development.json、appsettings.Production.json
- EnvironmentVariablesConfigurationProvider:讀取環境變量
- CommandLineConfigurationProvider:讀取指令行參數配置
接下來我們我們重點介紹“應用程式配置檔案”,“環境變量”,“指令行參數”,“app.config” 這四種最常用的配置讀取方式,通過代碼的方式,示例給大家:
二、讀取應用程式設定檔案appsettings.json
我們使用ASP.NET Core工程中預設的appsettings.json檔案
{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}
通過代碼讀取配置
var allowedHosts = Configuration["AllowedHosts"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
Debug.WriteLine("allowedHosts:" + allowedHosts + "\n");
Debug.WriteLine("defaultLogLevel:"+defaultLogLevel + "\n");
實際輸出:
allowedHosts:*
defaultLogLevel:Information
如果想讀取整個的LogLevel對象,如何實作?
建立LogLevel類和Logging類
[DataContract]
public class LogLevel
{
[DataMember(Name = "Default")]
public string Default { get; set; }
[DataMember(Name = "Microsoft")]
public string Microsoft { get; set; }
[DataMember(Name ="Microsoft.Hosting.Lifetime")]
public string MicrosoftHostingLifetime { get; set; }
}
[DataContract]
public class Logging
{
[DataMember]
public LogLevel LogLevel { get; set; }
}
讀取Logging配置示例代碼:
Logging logConfig = new Logging();
Configuration.GetSection("Logging").Bind(logConfig);
var lifetime = Configuration["Logging:LogLevel:Microsoft.Hosting.Lifetime"];
logConfig.LogLevel.MicrosoftHostingLifetime = lifetime;
上述代碼中,對Lifetime屬性的設定,通過以下方式實作,Bind的方式因為key比對的問題,無法完成比對。
Configuration["Logging:LogLevel:Microsoft.Hosting.Lifetime"];
這個地方補充一個帶環境類型的應用設定檔案的價值順序:比如說按環境分appsettings.json檔案
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIx0DciV2dmADM30zd-cGcq5CRzUyYHNWc1kWTzcGROJTU61EeRRFT4FEVOpXVE5UeFpWT4FEROdXQq10dJRFTxkEVOpXS6xEMBRUT5FkaNZXVq1UMNpWT2NmMiNnSywEd5ITW110MaZHetlVdO1GT3lERNl3YXJGc5kHT20ESjBjUIF2Lc12bj5SYphXa5VWen5WY35iclN3Ztl2Lc9CX6MHc0RHaiojIsJye.jpg)
預設的JsonConfigurationProvider ,按以下順序加載 appsettings.json檔案:
① appsettings.json
② appsettings.Environment.json,例如appsettings.Development.json ,appsettings.Production.json
關于appsettings.Environment.json,Environment的設定首頁在Program時指定的變量:
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseEnvironment("Development");
webBuilder.UseStartup<Startup>();
});
}
三、環境變量讀取
按照配置的加載順序,EnvironmentVariablesConfigurationProvider從環境變量中讀取配置資訊,在appsettings.json和Secret manager讀取配置之後。
這個地方有個分隔符的注意點,因為 :并不是在所有平台上都支援,建議統一使用__(雙下劃線),運作時會将__統一替換為:
先通過以下指令,設定環境變量:
set Key1="Value1"
set Logging__LogLevel__Customer=Information
代碼中讀取環境變量的配置
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostBuilder, config) =>
{
config.AddEnvironmentVariables();
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseEnvironment("Development");
webBuilder.UseStartup<Startup>();
});
修改Startup中Configure方法:讀取配置并輸出
var key1Value = Configuration["Key1"];
var logLevel = Configuration["Logging:LogLevel:Customer"];
Console.WriteLine("key1Value:" + key1Value + "\n");
Console.WriteLine("logLevel:" + logLevel + "\n");
四、指令行參數讀取
指令行配置提供程式CommandLineConfigurationProvider,将在以下配置源之後從指令行參數鍵值對加載配置:
- appsettings.json和appsettings。Environment。json檔案
- 開發環境中的應用程式機密(秘密管理器)
- 環境變量
繼續使用第三章中的示例工程,建立CMD指令行,輸入以下dotnet run指令:
dotnet run Key1="Value1" Logging:LogLevel:Customer="Information"
五、app.config讀取
這個場景最大的作用就是相容原有ASP.NET Web.Config檔案!
首先添加Nuget引用:System.Configuration.ConfigurationManager
新增app.config檔案:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="ConfigKey1" value="Value" />
</appSettings>
</configuration>
使用原有ConfigurationManager讀取配置:
var value = System.Configuration.ConfigurationManager.AppSettings["ConfigKey1"];
Console.WriteLine("ConfigKey1:" + value + "\n");
以上就是ASP.NET Core常用的“應用程式配置檔案”,“環境變量”,“指令行參數”,“app.config” 配置讀取方式,分享給大家。
周國慶
2020/4/1