ASP.NET Core(十)Configuration 配置优先级详解

ASP.NET Core 项目启动,默认执行顺序为:宿主 Host -> 读取配置 -> 日志设置 -> 注册服务(DI)-> 添加中间件 -> WebHost 监听 -> 后台 Work 启动。

配置的加载和读取是在启动流程的最前面。微软关于 ASP.NET Core 中的配置文档:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/configuration/?view=aspnetcore-6.0

Host.CreateDefaultBuilder 方法中,按照以下顺序为应用提供默认配置:

  • ChainedConfigurationProvider:添加现有的 作为源。在默认配置示例中,添加主机配置,并将它设置为应用配置的第一个源。

  • 使用 appsettings.json的 appsettings.json。

  • 使用 JSON 配置提供程序通过 appsettings..json 提供。例如,appsettings.Production.json 和 appsettings.Development.json。

  • 应用在 环境中运行时的应用机密。

  • 使用环境变量配置提供程序通过环境变量提供。

  • 使用命令行配置提供程序通过命令行参数提供。

源码如下:

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

a87f696fd30e19ee7ddbfeae7e31e4c8.png

通过代码可以看出,程序获取配置优先级依次为:appsettings.json -> appsettings.环境.json -> 环境变量 -> 命令行参数。我们根据优先级进行测试。

新建一个控制台方法返回所有配置信息,代码如下:

private readonly ILogger<HomeController> _logger;public IConfiguration _configuration { get; }public HomeController(ILogger<HomeController> logger, IConfiguration configuration){_logger = logger;_configuration = configuration;}public IActionResult Index(){return Json(_configuration.AsEnumerable());}

首先,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"}
}

尝试启动项目,查看 WebConfig:Name 和 WebConfig:Date 的配置,如下图:

ee3395f303e7f1400e1381415c53e332.png

找到 Properties -> launchSettings.json 文件,修改 ASPNETCORE_ENVIRONMENT 环境配置为 Test,如下:

"IIS Express": {"commandName": "IISExpress","launchBrowser": true,"environmentVariables": {"ASPNETCORE_ENVIRONMENT": "Test"}}

这时程序会读取 appsettings.Test.json 的配置,尝试重新启动项目,发现 WebConfig:Name 已经覆盖了,如下图:

b102a81f4261be47b1c47add5693ac5c.png

再次修改 launchSettings.json 文件,通过环境变量设置 WebConfig:Name 的值,代码如下:

"IIS Express": {"commandName": "IISExpress","launchBrowser": true,"environmentVariables": {"ASPNETCORE_ENVIRONMENT": "Test","WebConfig__Name": "itsvse env"}}

备注:环境变量修改 WebConfig:Name 的值,变量名称为:WebConfig__Name (中间用双下划线隔开

尝试重启项目,发现 WebConfig:Name 的值,已经被环境变量设置的值所覆盖,如下图:

176ede550deeb2b401600442598e4f05.png

尝试通过命令行的形式修改默认配置的值,启动命令如下:

dotnet run --WebConfig:Name="itsvse command"

如下图:

5e88de4a9f245c170b66f97f3bf9972b.png

用实践来测试配置键值的优先级,完。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/290591.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《BeagleBone开发指南》——1.7 小结

本节书摘来异步社区《BeagleBone开发指南》一书中的第1章&#xff0c;第1.7节&#xff0c;作者&#xff1a;【爱】Derek Molloy&#xff08;莫洛伊&#xff09;&#xff0c;更多章节内容可以访问云栖社区“异步社区”公众号查看。 1.7 小结 在完成本章后&#xff0c;你应该具备…

软件配置管理(一)配置管理概念与目标

软件配置管理的定义 软件配置管理&#xff08;Software Configuration Management,SCM&#xff09;是一组针对软件产品的追踪和控制活动&#xff0c;它贯穿于项目生命周期的始终&#xff0c;并代表软件产品接受各项评审。 软件配置管理的目的 软件配置管理是贯穿于整个软件过…

Android之运行Java.lang.UnsatisfiedLinkError的错误解决办法

1、问题 部分手机运行的时候在jni层出现这个错误,导致手机崩溃 Java.lang.UnsatisfiedLinkError 2、解决办法 是因为在我是这样写的 static {System.loadLibrary("");} 把报错的依赖加进去 static {System.loadLibrary("");System.loadLibrary("&q…

带中文索引的ListView 仿微信联系人列表

因为各种原因&#xff0c;项目经理和产品经理把我做的东西给否定了&#xff0c;所以决定分享出去。 主要功能&#xff1a; 1 、带中文索引的ListView 2、自己定义顶部搜索视图&#xff0c;能够对返回button&#xff0c;搜索button加入事件监听&#xff0c;带动画的咧&#xff0…

APP访问路径和销售归因分析

用户浏览路径是分析用户行为的关键&#xff0c;也是页面分析的关键。虽然可以很方便的获取到PV数据&#xff0c;但却无法知道用户是浏览哪些页面后来到当前页面&#xff0c;也不知道浏览过当前页面的用户又去了哪些其他页面。诸如此类的问题还有&#xff1a;某专题活动产生了多…

解决 ASP.NET Core 部署到 IIS,更新项目时文件夹正在使用错误

前言虽然 ASP.NET Core 应用程序是跨平台的&#xff0c;但我们还是经常将它部署到 Windows 的 IIS 下。当 ASP.NET Core 站点运行时&#xff0c;它会锁定正在使用的程序集&#xff0c;如果这时向站点目录下复制文件进行更新&#xff0c;会提示文件被占用的错误&#xff1a;这时…

linux之用xargs删除这个目录下面后缀为txt的文件(包括子目录)

1问题 删除这个目录下面后缀为txt的文件&#xff08;包括子目录&#xff09; 2、xargs命令解决 find . -name "*.txt" | xargs rm -rf3、xargs相关用途 比如在特定的文件里面找到相应的关键字 find . -name "*.txt" | xargs grep word或者 grep -r wor…

软件配置管理(二)配置管理角色与过程

文章目录一、配置管理角色及职责项目经理&#xff08;PM&#xff09;配置控制委员会&#xff08;CCB&#xff09;配置管理员&#xff08;CMO&#xff09;系统集成员&#xff08;SIO&#xff09;开发人员&#xff08;DEV&#xff09;二、配置管理基本流程计划阶段开发和维护阶段…

JAVA多线程和并发基础面试问答

原文链接 译文连接 作者&#xff1a;Pankaj 译者&#xff1a;郑旭东 校对&#xff1a;方腾飞 多线程和并发问题是Java技术面试中面试官比较喜欢问的问题之一。在这里&#xff0c;从面试的角度列出了大部分重要的问题&#xff0c;但是你仍然应该牢固的掌握Java多线程基础知识…

学习笔记(二)JavaScript基本概念(语法,数据类型,控制语句,函数)

一.语法 1.javascirpt中一切&#xff08;变量&#xff0c;函数名和操作符&#xff09;是严格区分大小写的。 2.javascript&#xff08;标识符&#xff09; 所谓标识符&#xff0c;就是指变量&#xff0c;函数&#xff0c;属性的名字&#xff0c;或者函数的参数。 命名规则&…

Android悬浮窗口的实现

效果图&#xff1a;&#xff08;悬浮框可拖动&#xff09; 在项目开发中有一个需求&#xff1a;弹出悬浮窗后&#xff0c;响应悬浮窗的事件再弹出对话框&#xff0c;但是对话框怎么也不显示。也就是说在弹出悬浮框的同时&#xff0c;不能再弹出对话框&#xff0c;可能的原因&am…

Android之invalid address or address of corrupt block 0xabb494a0 passed to dlfree崩溃解决办法

1、问题 手机崩溃 invalid address or address of corrupt block 0xabb494a0 passed to dlfree Fatal signal 11 (SIGSEGV), code 1, fault addr 0xdeadbaad in tid 29629 (AsyncTask #1) #00 pc 000308a6 /system/lib/libc.so (dlfree1285) 2、原因 const char* 转char *的…

软件配置管理(三)软件配置管理核心功能

文章目录一、CMM/CMMI与软件配置管理产品完整性二、三库管理三、基线管理基线管理的好处基线管理的步骤四、配置库管理五、变更管理变更管理流程六、配置审计七、配置状态报告一、CMM/CMMI与软件配置管理 软件配置管理是CMM/CMMI二级&#xff08;可重复级&#xff09;的一个重…

移除指定 global using 命名空间

前言在《.NET 6新特性试用 | 隐式using指令》中&#xff0c;我们介绍过&#xff0c;开启隐式using指令时&#xff0c;会在编译时生成 GlobalUsings.g.cs 文件&#xff0c;加入大量 global using 指令&#xff1a;// <auto-generated/> global using global::Microsoft.As…

Ubuntu 每日技巧- 自动备份Ubuntu 14.04到Box云存储上

Ubuntu 每日技巧- 自动备份Ubuntu 14.04到Box云存储上 如今你已经升级或者安装了Ubuntu 14.04&#xff0c; 但是还有另外一件保护你的新系统需要做的事情&#xff1a;备份&#xff01; Ubuntu内置了一个备份工具 Dj Dup Backup Tool。它允许你备份你的系统并保存在本地或者通过…

程序员学好英语的方法(转)

英语对每个人来说都很重要&#xff0c;对于程序员来说尤其的重要&#xff0c;因为一些框架都是外国大佬写的&#xff0c;我们要时时的阅读 API,而这些 API 大多数都是英文了&#xff0c;所以我们程序员对英语的要求还是蛮高的。下面我整理的一些学习英语的方法&#xff0c;分享…

软件配置管理(四)代码味道与重构

文章目录重构的概念及意义代码味道代码味道分类1.类内味道1.1 可度量的味道-Measured Smells1.1.1 过长函数-Long Method1.1.2 过大类-Large Class1.1.3 过长参数列-Long Parameter List1.1.4 过多的注释-Comments1.2 不必要的复杂性-Unnecessary Complexity1.2.1 夸夸其谈的未…

Atitit。 《吠陀》 《梨俱吠陀》overview 经读后感  是印度上古时期一些文献的总称...

Atitit。 《吠陀》 《梨俱吠陀》overview 经读后感 是印度上古时期一些文献的总称 1. 印度古《吠陀》经&#xff0c;是印度上古时期一些文献的总称&#xff0c; 1 1.1.1. 医学意义 2 2. 梨俱吠陀&#xff08;篇章规模&#xff0c;字数&#xff09; 2 2.1. 神曲结构模式编辑 2 …

【C#/.NET 日常开发技巧】JWT+ActionFilter 简便控制器代码

微信公众号&#xff1a;趣编程ACE关注可了解更多.NET日常开发技巧&#xff0c;如需源码&#xff0c;请公众号留言 源码;JWTActionFilter 简便控制器代码这是微软关于过滤器的介绍&#xff1a;https://docs.microsoft.com/zh-cn/aspnet/core/mvc/controllers/filters?viewaspne…

在P2P市场中代替“看不见的手”的算法在哪里

◆ ◆ ◆ 本文简单探讨P2P市场机制&#xff0c;在此基础上探讨匹配撮合服务的可能性。 ◆ ◆ ◆ P2P市场机制基本定义与假设 首先&#xff0c;我们回顾一些基本定义与假设。P2P市场为“网络借贷是指个体和个体之间通过互联网平台实现的直接借贷。”[2]利率决定一般是平台决定借…