ASP.NET Core 8 的配置类 Configuration
Configuration
Configuration 可以从两个途径设置:
- WebApplication创建的对象app.Configuration 属性
- WebApplicationBuilder 创建的 builder.Configuration 属性
app的Configuration优先级更高,host Configuration作为替补配置,因为app运行在host之上。
每种方式都提供了非常丰富的配置选择,可用于各种场景,以便在开发环境和产品环境时使用。
Host 预设的变量
这些变量在初始化builder的时候,就预设了:
- Application 名称
- Environment 名称, 比如 Development, Production, and Staging
- Content 根目录
- Web 根目录
- 标识是否扫描启动要用的DLL
- App 和 IHostBuilder.ConfigureAppConfiguration 回调中的HostBuilderContext.Configuration 的代码要读取的变量
其他host的设置项都从 App 的Configuration 读取,而不是从host的Configuration 读取。
只有在App 的Configuration 中没有设置的情况下,才从host的Configuration 读取。
Application configuration 的provider及优先级排序
按照优先级排序:
- 命令行启动参数
- 无前缀的环境变量
- Development 环境中的 User secrets
- appsettings.{Environment}.json 文件,比如 appsettings.Production.json 或者 appsettings.Development.json
- appsettings.json 文件
引入这些provider的顺序与它们的优先级相反,下面从低到高介绍各个provider:
appsettings.json 文件的例子
{"Position": {"Title": "Editor","Name": "Joe Smith"},"MyKey": "My appsettings.json Value","Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"}},"AllowedHosts": "*"
}
可以这样读取:
var myKeyValue = Configuration["MyKey"];
var name = Configuration["Position:Name"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
User Secret
无前缀的环境变量
无前缀的环境变量是不带 ASPNETCORE_ 或者 DOTNET_ 前缀的环境变量,
比如 launchSettings.json 文件中的 “ASPNETCORE_ENVIRONMENT”: “Development”。
可以通过代码:
builder.Configuration.AddEnvironmentVariables(prefix: "MyCustomPrefix_");
或者命令行:
setx MyKey "My key from setx Environment" /M
setx Position__Title Environment_Editor /M
setx Position__Name Environment_Rick /M
来设置。
launchSettings.json 中的 环境变量
launchSettings.json 中的 环境变量会覆盖上面设置的系统变量:
"applicationUrl": "https://localhost:5001;http://localhost:5000"
遍历所有环境变量
以便debug。
var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
foreach (var c in builder.Configuration.AsEnumerable())
{Console.WriteLine(c.Key + " = " + c.Value);
}
命令行启动参数
如:
dotnet run MyKey="Using =" Position:Title=Cmd Position:Name=Cmd_Rick
还可以预设一下mapping,将短的启动参数映射到原有的长参数名上:
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
var switchMappings = new Dictionary<string, string>(){{ "-k1", "key1" },{ "-k2", "key2" },{ "--alt3", "key3" },{ "--alt4", "key4" },{ "--alt5", "key5" },{ "--alt6", "key6" },};
builder.Configuration.AddCommandLine(args, switchMappings);
var app = builder.Build();
然后当用命令行时:
dotnet run -k1 value1 -k2 value2 --alt3=value2 /alt4=value3 --alt5 value5 /alt6 value6
-k1 的值就被映射到key1上了。
也可以通过Visual Studio的Debug窗口设置启动参数。
数据库连接前缀
- CUSTOMCONNSTR_ :自宝义provider
- MYSQLCONNSTR_ MySQLprovider
- SQLAZURECONNSTR_ :Azure SQL Database
- SQLCONNSTR_ :SQL Serverprovider
当在环境变量中发现这些前缀的变量时,前缀会被去掉,然后数据库的连接字符串会自动改成:
MYSQLCONNSTR_{KEY} --> ConnectionStrings:{KEY}
然后通过config可以读取到 数据库provider,自宝义provider则没有 数据库provider:
key: ConnectionStrings:{KEY}_ProviderName
value: MySql.Data.MySqlClient
文件型配置的Provider
- INI 配置 provider
var builder = WebApplication.CreateBuilder(args);
builder.Configuration.AddIniFile("MyIniConfig.ini", optional: true, reloadOnChange: true).AddIniFile($"MyIniConfig.{builder.Environment.EnvironmentName}.ini",optional: true, reloadOnChange: true);
builder.Configuration.AddEnvironmentVariables();
builder.Configuration.AddCommandLine(args);
builder.Services.AddRazorPages();
var app = builder.Build();
INI文件的例子:
MyKey="MyIniConfig.ini Value"[Position]
Title="My INI Config title"
Name="My INI Config name"[Logging:LogLevel]
Default=Information
Microsoft=Warning
- JSON 配置provider
using Microsoft.Extensions.DependencyInjection.ConfigSample.Options;
var builder = WebApplication.CreateBuilder(args);
builder.Configuration.AddJsonFile("MyConfig.json",optional: true, //The file is optionalreloadOnChange: true); //The file is reloaded when changes are saved
builder.Services.AddRazorPages();
var app = builder.Build();
一般用不到JSON 配置provider
- XML 配置 provider
var builder = WebApplication.CreateBuilder(args);
builder. Configuration.AddXmlFile("MyXMLFile.xml", optional: true, reloadOnChange: true).AddXmlFile($"MyXMLFile.{builder.Environment.EnvironmentName}.xml",optional: true, reloadOnChange: true);
builder.Configuration.AddEnvironmentVariables();
builder.Configuration.AddCommandLine(args);
builder.Services.AddRazorPages();
var app = builder. Build();
XML文件的例子:
<?xml version="1.0" encoding="utf-8" ?>
<configuration><MyKey>MyXMLFile Value</MyKey><Position><Title>Title from MyXMLFile</Title><Name>Name from MyXMLFile</Name></Position><Logging><LogLevel><Default>Information</Default><Microsoft>Warning</Microsoft></LogLevel></Logging>
</configuration>
Key-per-file 配置 provider
用于docker,使用一个目录中的文件作为配置。key是文件名,value是文件内容。
builder.Host.ConfigureAppConfiguration((hostingContext, config) =>
{var path = Path.Combine(Directory.GetCurrentDirectory(), "path/to/files");config.AddKeyPerFile(directoryPath: path, optional: true);
})
内存配置 Provider
var builder = WebApplication.CreateBuilder(args);
var Dict = new Dictionary<string, string>{{"MyKey", "Dictionary MyKey Value"},{"Position:Title", "Dictionary_Title"},{"Position:Name", "Dictionary_Name" },{"Logging:LogLevel:Default", "Warning"}};builder.Configuration.AddInMemoryCollection(Dict);
builder.Configuration.AddEnvironmentVariables();
builder.Configuration.AddCommandLine(args);
builder.Services.AddRazorPages();
var app = builder.Build();
配置Kestrel 的 EndPoint
可以在appsettings.json中配置:
{"Kestrel": {"Endpoints": {"Https": {"Url": "https://localhost:9999"}}},"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"}},"AllowedHosts": "*"
}
从依赖注入访问Config
public class Service
{private readonly IConfiguration _config;public Service(IConfiguration config) =>_config = config;public void DoSomething(){var configSettingValue = _config["ConfigSetting"];// ...}
}
从Razor Pages中访问Config
@page
@model Test5Model
@using Microsoft.Extensions.Configuration
@inject IConfiguration ConfigurationConfiguration value for 'MyKey': @Configuration["MyKey"]
从 MVC Page中访问 Config
@using Microsoft.Extensions.Configuration
@inject IConfiguration ConfigurationConfiguration value for 'MyKey': @Configuration["MyKey"]
从Main函数中访问
var builder = WebApplication.CreateBuilder(args);
var key1 = builder.Configuration.GetValue<string>("KeyOne");
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
var key2 = app.Configuration.GetValue<int>("KeyTwo");
var key3 = app.Configuration.GetValue<bool>("KeyThree");
app.Logger.LogInformation("KeyOne: {KeyOne}", key1);
app.Logger.LogInformation("KeyTwo: {KeyTwo}", key2);
app.Logger.LogInformation("KeyThree: {KeyThree}", key3);
app.Run();
Host configuration vs App configuration
在启动和配置App前,Host 先被配置,并先被启动。
然后Host负责启动 App 和 App的生命周期管理。
App和Host 都用上面提到的各种provider。
Host configuration也会包含在App configuration,但是App configuration的优先级更高。
其他配置
- launch.json/launchSettings.json ,用于开发环境。
- web.config,是server配置文件。
相关文章:
ASP.NET Core 8 的配置类 Configuration
Configuration Configuration 可以从两个途径设置: WebApplication创建的对象app.Configuration 属性WebApplicationBuilder 创建的 builder.Configuration 属性 app的Configuration优先级更高,host Configuration作为替补配置,因为app运行…...
MySql增量恢复
一、 使用二进制日志的时间点恢复 注意 本节和下一节中的许多示例都使用mysql客户端来处理mysqlbinlog生成的二进制日志输出。如果您的二进制日志包含\0(null)字符,那么mysql将无法解析该输出,除非您使用--binary模式选项调用它。…...

设计模式--装饰者模式(Decorator Pattern)
一、什么是装饰者模式(Decorator Pattern) 装饰者模式(Decorator Pattern)是一种结构型设计模式,它允许你在不修改现有对象的情况下,动态地将新功能附加到对象上。这种模式通过创建一个包装类,…...

Spring三级缓存解决循环依赖
Spring三级缓存解决循环依赖 一 Spring bean对象的生命周期 二 三级缓存解决循环依赖 实现原理解析 spring利用singletonObjects, earlySingletonObjects, singletonFactories三级缓存去解决的,所说的缓存其实也就是三个Map 先实例化的bean会通过ObjectFactory半…...
Vscode自动移出不用的包
Vscode自动移出不用的包 在Vscode中删除不用的包、Vscode移出不用的包、Vscode移出不用的import包 设置 找到setting.json(在字体设置里面),添加如下配置 "editor.codeActionsOnSave": { "source.organizeImports": tru…...
leetcode做题笔记120. 三角形最小路径和
给定一个三角形 triangle ,找出自顶向下的最小路径和。 每一步只能移动到下一行中相邻的结点上。相邻的结点 在这里指的是 下标 与 上一层结点下标 相同或者等于 上一层结点下标 1 的两个结点。也就是说,如果正位于当前行的下标 i ,那么下一…...

weblogic/CVE-2018-2894文件上传漏洞复现
启动docker环境 查看帮助文档 环境启动后,访问http://your-ip:7001/console,即可看到后台登录页面。 执行docker-compose logs | grep password可查看管理员密码,管理员用户名为weblogic,密码为lFVAJ89F 登录后台页面,…...

windows10默认浏览器总是自动更改为Edge浏览器
在设置的默认应用设置中把默认浏览器改为chrome或其他之后他自动又会改回Edge。不得不说*软真的狗。 解决办法: 后来发现在Edge浏览器的设置中有这么一个选项,会很无耻的默认是Edge。把它关掉后重新设置就行了。...
系统架构设计师考试论文:论软件架构风格与应用
软件体系结构风格是描述某一特定应用领域中系统组织方式的惯用模式。体系结构风格定义一个系统家族,即一个体系结构定义一个词汇表和一纽约束。词汇表中包含一些构件和连接件类型,而这组约束指出系统是如何将这些构件和连接件组合起来的。体系结构风格反…...

xss-labs靶场通关详解
文章目录 前言level1level2level3level4level5level6level7level8level9level10level11level12level13level14level15level16level17level18level19&level20 前言 赶着假期结尾的时候,赶紧给自己找点任务做。现在对xss还是一知半解,只是了解个大概&a…...
关于类和接口
类和接口的区别,去除语法层面,谈谈编程层面的意义。 设计原则SOLID: S:单一职责(SRP),Single Responsibility Principle O:开-闭原则(OCP),Open-Closed Principle L:里氏替换(LSP)&…...

网络安全社区与资源分享: 推荐网络安全社区、论坛、博客、培训资源等,帮助从业者拓展人脉和知识。
第一章:引言 在当今数字化的世界中,网络安全问题变得愈发突出。随着各种新型威胁的涌现,网络安全从业者面临着持续不断的挑战。然而,正是因为这些挑战,网络安全社区应运而生,成为从业者们互相交流、学习和…...

SAP MM学习笔记26- SAP中 振替转记(转移过账)和 在库转送(库存转储)5 - 总结
SAP 中在库移动 不仅有入库(GR),出库(GI),也可以是单纯内部的转记或转送。 1,振替转记(转移过账) 具体查看我之前的文章。 SAP MM学习笔记26- SAP中 振替转记ÿ…...
Stable Diffusion WebUI提示词Prompts常用推荐
在Stable Diffusion(以下简称SD)中,提示词是很重要的一部分,写好提示词就能让画图事半功倍,下面介绍一款好用的工具,能很程度上让你更轻松。 他就是sd-webui-prompt-all-in-one 下面将详细介绍的安装以及使用,后面将详细讲解提示词(Prompt)应该如何写提示词才能使画…...
Android 13 Ethernet变更
Android13 有线变更 以太网相关的功能在Android12 和13 网络部分变化是不大的,Android11 到Android 12 网络部分无论是代码存放目录和代码逻辑都是有较多修改的,主要包括以下几个部分 限制了设置有线网参数设置接口方法 新增有线网开启关闭接口方法 新…...

基于单片机的超声波语音测距系统
一、系统方案 超声波具有指向性强,能量消耗缓慢,在介质中传播的距离较远,因而超声波经常用于距离的测量,如测距仪和物位测量仪等都可以通过超声波来实现。利用超声波检测往往比较迅速、方便、计算简单、易于做到实时控制ÿ…...
算法系列-力扣876-求链表的中间节点
# 求链表中间节点,如果有两个中间节点取后面那个 链表定义 // lc codestart /** * Definition for singly-linked list. * public class ListNode { * int val; * ListNode next; * ListNode() {} * ListNode(int val) { this.val val; } * …...
SpringBoot集成Redis、Redisson保姆教程【附源码】
1. SpringBoot集成Redis 关于Redis的安装,这里就不重复介绍了,需要的朋友可以看我之前的博文Redis多系统安装(Windows、Linux、Ubuntu) Redis原生命令大全,作者整理的很详细,大部分命令转化为java命令基本也是关键词 Redis 命令参考 接下来开始我们的正题,一起学习下…...
c++多线程中常用的使用方法
1)promise(保证)和future的联合使用,实现两个线程的数据传递 #include <iostream> #include<thread> #include<future>using namespace std;//promise用法:可以给线程一个值,而从另一个线程读出该值 // 实现了两个线程的数…...

【dart】dart基础学习使用(一):变量、操作符、注释和库操作
前言 学习dart语言。 注释 Dart 支持单行注释、多行注释和文档注释。 单行注释 单行注释以 // 开头。Dart 编译器将忽略从 // 到行尾之间的所有内容。 void main() {// 这是单行注释print(Welcome to my Llama farm!); }多行注释 多行注释以 /* 开始,以 / 结…...

大话软工笔记—需求分析概述
需求分析,就是要对需求调研收集到的资料信息逐个地进行拆分、研究,从大量的不确定“需求”中确定出哪些需求最终要转换为确定的“功能需求”。 需求分析的作用非常重要,后续设计的依据主要来自于需求分析的成果,包括: 项目的目的…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
Java 8 Stream API 入门到实践详解
一、告别 for 循环! 传统痛点: Java 8 之前,集合操作离不开冗长的 for 循环和匿名类。例如,过滤列表中的偶数: List<Integer> list Arrays.asList(1, 2, 3, 4, 5); List<Integer> evens new ArrayList…...

跨链模式:多链互操作架构与性能扩展方案
跨链模式:多链互操作架构与性能扩展方案 ——构建下一代区块链互联网的技术基石 一、跨链架构的核心范式演进 1. 分层协议栈:模块化解耦设计 现代跨链系统采用分层协议栈实现灵活扩展(H2Cross架构): 适配层…...

WordPress插件:AI多语言写作与智能配图、免费AI模型、SEO文章生成
厌倦手动写WordPress文章?AI自动生成,效率提升10倍! 支持多语言、自动配图、定时发布,让内容创作更轻松! AI内容生成 → 不想每天写文章?AI一键生成高质量内容!多语言支持 → 跨境电商必备&am…...

微信小程序云开发平台MySQL的连接方式
注:微信小程序云开发平台指的是腾讯云开发 先给结论:微信小程序云开发平台的MySQL,无法通过获取数据库连接信息的方式进行连接,连接只能通过云开发的SDK连接,具体要参考官方文档: 为什么? 因为…...
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析
Java求职者面试指南:Spring、Spring Boot、MyBatis框架与计算机基础问题解析 一、第一轮提问(基础概念问题) 1. 请解释Spring框架的核心容器是什么?它在Spring中起到什么作用? Spring框架的核心容器是IoC容器&#…...
虚拟电厂发展三大趋势:市场化、技术主导、车网互联
市场化:从政策驱动到多元盈利 政策全面赋能 2025年4月,国家发改委、能源局发布《关于加快推进虚拟电厂发展的指导意见》,首次明确虚拟电厂为“独立市场主体”,提出硬性目标:2027年全国调节能力≥2000万千瓦࿰…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...

Xela矩阵三轴触觉传感器的工作原理解析与应用场景
Xela矩阵三轴触觉传感器通过先进技术模拟人类触觉感知,帮助设备实现精确的力测量与位移监测。其核心功能基于磁性三维力测量与空间位移测量,能够捕捉多维触觉信息。该传感器的设计不仅提升了触觉感知的精度,还为机器人、医疗设备和制造业的智…...