ASP.NET Core(十)Configuration 配置优先级详解
ASP.NET Core 項(xiàng)目啟動(dòng),默認(rèn)執(zhí)行順序?yàn)?#xff1a;宿主 Host -> 讀取配置 -> 日志設(shè)置 -> 注冊服務(wù)(DI)-> 添加中間件 -> WebHost 監(jiān)聽 -> 后臺(tái) Work 啟動(dòng)。
配置的加載和讀取是在啟動(dòng)流程的最前面。微軟關(guān)于 ASP.NET Core 中的配置文檔:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/configuration/?view=aspnetcore-6.0
Host.CreateDefaultBuilder 方法中,按照以下順序?yàn)閼?yīng)用提供默認(rèn)配置:
ChainedConfigurationProvider:添加現(xiàn)有的 作為源。在默認(rèn)配置示例中,添加主機(jī)配置,并將它設(shè)置為應(yīng)用配置的第一個(gè)源。
使用 appsettings.json的 appsettings.json。
使用 JSON 配置提供程序通過 appsettings..json 提供。例如,appsettings.Production.json 和 appsettings.Development.json。
應(yīng)用在 環(huán)境中運(yùn)行時(shí)的應(yīng)用機(jī)密。
使用環(huán)境變量配置提供程序通過環(huán)境變量提供。
使用命令行配置提供程序通過命令行參數(shù)提供。
源碼如下:
public static IHostBuilder CreateDefaultBuilder(string[] args){var builder = new HostBuilder();builder.UseContentRoot(Directory.GetCurrentDirectory());builder.ConfigureHostConfiguration(config =>{config.AddEnvironmentVariables(prefix: "DOTNET_");if (args != null){config.AddCommandLine(args);}});builder.ConfigureAppConfiguration((hostingContext, config) =>{var env = hostingContext.HostingEnvironment;config.AddJsonFile("appsettings.json", optional: true, reloadOnChange: true).AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true, reloadOnChange: true);if (env.IsDevelopment() && !string.IsNullOrEmpty(env.ApplicationName)){var appAssembly = Assembly.Load(new AssemblyName(env.ApplicationName));if (appAssembly != null){config.AddUserSecrets(appAssembly, optional: true);}}config.AddEnvironmentVariables();if (args != null){config.AddCommandLine(args);}}).ConfigureLogging((hostingContext, logging) =>{var isWindows = RuntimeInformation.IsOSPlatform(OSPlatform.Windows);// IMPORTANT: This needs to be added *before* configuration is loaded, this lets// the defaults be overridden by the configuration.if (isWindows){// Default the EventLogLoggerProvider to warning or abovelogging.AddFilter<EventLogLoggerProvider>(level => level >= LogLevel.Warning);}logging.AddConfiguration(hostingContext.Configuration.GetSection("Logging"));logging.AddConsole();logging.AddDebug();logging.AddEventSourceLogger();if (isWindows){// Add the EventLogLoggerProvider on windows machineslogging.AddEventLog();}}).UseDefaultServiceProvider((context, options) =>{var isDevelopment = context.HostingEnvironment.IsDevelopment();options.ValidateScopes = isDevelopment;options.ValidateOnBuild = isDevelopment;});return builder;}源碼地址:https://github.com/dotnet/extensions/blob/release/3.1/src/Hosting/Hosting/src/Host.cs
通過代碼可以看出,程序獲取配置優(yōu)先級依次為:appsettings.json -> appsettings.環(huán)境.json -> 環(huán)境變量 -> 命令行參數(shù)。我們根據(jù)優(yōu)先級進(jìn)行測試。
新建一個(gè)控制臺(tái)方法返回所有配置信息,代碼如下:
首先,appsettings.json 配置文件,如下:
{"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"}},"AllowedHosts": "*","WebConfig": {"Name": "itsvse.com","Date": "2021"} }?新建 appsettings.Test.json 配置,如下:
{"WebConfig": {"Name": "itsvse.com test"} }嘗試啟動(dòng)項(xiàng)目,查看 WebConfig:Name 和 WebConfig:Date 的配置,如下圖:
找到 Properties ->?launchSettings.json?文件,修改 ASPNETCORE_ENVIRONMENT 環(huán)境配置為 Test,如下:
"IIS Express": {"commandName": "IISExpress","launchBrowser": true,"environmentVariables": {"ASPNETCORE_ENVIRONMENT": "Test"}}這時(shí)程序會(huì)讀取 appsettings.Test.json 的配置,嘗試重新啟動(dòng)項(xiàng)目,發(fā)現(xiàn)?WebConfig:Name 已經(jīng)覆蓋了,如下圖:
再次修改 launchSettings.json 文件,通過環(huán)境變量設(shè)置 WebConfig:Name 的值,代碼如下:
"IIS Express": {"commandName": "IISExpress","launchBrowser": true,"environmentVariables": {"ASPNETCORE_ENVIRONMENT": "Test","WebConfig__Name": "itsvse env"}}備注:環(huán)境變量修改 WebConfig:Name 的值,變量名稱為:WebConfig__Name (中間用雙下劃線隔開)
嘗試重啟項(xiàng)目,發(fā)現(xiàn) WebConfig:Name 的值,已經(jīng)被環(huán)境變量設(shè)置的值所覆蓋,如下圖:
嘗試通過命令行的形式修改默認(rèn)配置的值,啟動(dòng)命令如下:
dotnet run --WebConfig:Name="itsvse command"
如下圖:
用實(shí)踐來測試配置鍵值的優(yōu)先級,完。
總結(jié)
以上是生活随笔為你收集整理的ASP.NET Core(十)Configuration 配置优先级详解的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: c#使用FluentFtp实现一行代码实
- 下一篇: 解决 ASP.NET Core 部署到