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及优先级排序

按照优先级排序:

  1. 命令行启动参数
  2. 无前缀的环境变量
  3. Development 环境中的 User secrets
  4. appsettings.{Environment}.json 文件,比如 appsettings.Production.json 或者 appsettings.Development.json
  5. 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配置文件。

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

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

相关文章

基于Django+node.js+MySQL+杰卡德相似系数智能新闻推荐系统——机器学习算法应用(含Python全部工程源码)+数据集

目录 前言总体设计系统整体结构图系统流程图 运行环境Python 环境node.js前端环境MySQL数据库 模块实现1. 数据预处理2. 热度值计算3. 相似度计算1&#xff09;新闻分词处理2&#xff09;计算相似度 4. 新闻统计5. API接口开发6. 前端界面实现1&#xff09;运行逻辑2&#xff0…

用kotlin 开发一个简单的多页面跳转

本文介绍一个简单的安卓应用的页面跳转例子&#xff0c;用的是kotlin。 运行时主页面是一个hello 和Jump 按钮&#xff0c;你按一下jump 按钮就转到 从页面&#xff0c;只是标识从页面。 开始建立一个简单工程&#xff0c;名为hello&#xff0c; 选择的是Empty views Activit…

文心一言 VS CHATGPT

由于近几天来&#xff0c;我的手机短信不断收到百度公司对于“文心一言”大模型的体验邀请&#xff08;真是不胜其烦&#xff09;&#xff01;&#xff01;所以我就抱着试试看的态度点开了文心一言的链接&#xff1a;文心一言 目前看来&#xff0c;有以下两点与chatgpt是有比较…

什么是浏览器缓存(browser caching)?如何使用HTTP头来控制缓存?

聚沙成塔每天进步一点点 ⭐ 专栏简介⭐ 浏览器缓存和HTTP头控制缓存⭐ HTTP头控制缓存1. Cache-Control2. Expires3. Last-Modified 和 If-Modified-Since4. ETag 和 If-None-Match ⭐ 缓存策略⭐ 写在最后 ⭐ 专栏简介 前端入门之旅&#xff1a;探索Web开发的奇妙世界 记得点击…

新方案unity配表工具

工具下载&#xff1a;网盘链接 工具结构&#xff1a;针对每张表格生成一个表格类&#xff0c;其中默认包含一个list和字典类型参数记录表格数据&#xff0c;初始化项目时将list中的数据转为按id索引的dictionary&#xff0c;用于访问数据。额外包含一个同名Temp后缀的类&#…

反弹shell总结

反弹shell总结 讲在前面说的话:反弹shell总结nc反弹shell正向shell反向shell正向shell(服务端被攻击):反向shell(客户端被攻击):无nc反弹shellpython反弹shellbash反弹shellPHP反向shellPerl反向shellJava反弹shellsocat 反弹shellRuby反弹shellLua反弹shellAwk 反弹she…

5年前我们摸爬滚打进入测试行业,如今的你后悔吗?

记得在求职的时候&#xff0c;面试官经常问我&#xff1a;“为什么要选择软件测试工作?”而我也会经常说一堆自己有的没的优势去应付。 工作这么久了&#xff0c;也不再浮躁&#xff0c;静下心来回忆当初选择软件测试工作的历程&#xff0c;也是对自己职业生涯的一次回顾。 一…

简化测试流程,提供卓越服务:TestComplete+Salesforce满足不断发展的企业的需求

2015年&#xff0c;一群前Salesforce员工发现了病毒防护市场中的一个空白&#xff1a;Salesforce不会对文档进行威胁扫描。为了填补这一空白&#xff0c;他们创建了一个平台&#xff0c;并以该平台作为中心帮助公司保护所有的企业云SaaS系统&#xff0c;使其免受威胁。这个平台…

部署java程序的服务器cpu过高如何排查和解决

1.top命令找到占用CPU高的Java进程PID 2.根据进程ID找到占用CPU高的线程 ps -mp pid -o THREAD,tid | sort -r ps -mp 124682 -o THREAD,tid | sort -r 3.将指定的线程ID输出为16进制格式 printf “%x\n” tid printf "%x\n" 6384 18f0 4.jstack pid |…

【ES6】Promise推荐用法

一般来说&#xff0c;不要在then()方法里面定义 Reject 状态的回调函数&#xff08;即then的第二个参数&#xff09;&#xff0c;总是使用catch方法。 // bad promise.then(function(data) {// success}, function(err) {// error});// good promise.then(function(data) { //…

设计模式-原型模式详解

文章目录 前言理论基础1. 原型模式定义2. 原型模式角色3. 原型模式工作过程4. 原型模式的优缺点 实战应用1. 原型模式适用场景2. 原型模式实现步骤3. 原型模式与单例模式的区别 原型模式的变体1. 带有原型管理器的原型模式2. 懒汉式单例模式的原型模式实现3. 细粒度原型模式 总…

FPGA时序分析与约束(1)——组合电路时序

写在最前面&#xff1a; 关于时序分析和约束的学习似乎是学习FPGA的一道分水岭&#xff0c;似乎只有理解了时序约束才能算是真正入门了FPGA&#xff0c;对于FPGA从业者或者未来想要从事FPGA开发的工程师来说&#xff0c;时序约束可以说是一道躲不过去的坎&#xff0c;所以从这篇…

CSS魔术师Houdini,用浏览器引擎实现高级CSS效果

开门见山&#xff0c;直接上货 &#x1f50d; CSS Houdini是什么&#xff1f; “Houdini”一词引用自“Harry Houdini”&#xff0c;他是一位20世纪的著名魔术师&#xff0c;亦被称为史上最伟大的魔术师、逃脱术师及特级表演者。 我们都知道&#xff0c;浏览器在渲染网页显示样…

异或和大小比较类问题——抓住最高位:CF1863F

https://codeforces.com/contest/1863/problem/F 因为有等于&#xff0c;所以考虑异或和为0的合法区间&#xff0c;它可以随意切现在考虑切开后左边大于右边&#xff0c;可以发现左右边最高位可以互相抵消&#xff0c;似乎不太可做&#xff1f;此时可以换个考虑&#xff0c;考…

长安三万里,安全无边界

数字化转型时代下&#xff0c;随着移动办公和云服务的兴起&#xff0c;网络边界日益越模糊&#xff0c;组织传统安全手段逐渐失效&#xff0c;边界之内也不再是企业应用和个人设备运行的安全地带。 由于传统边界安全体系默认“信任”所有内部访问流量&#xff0c;从而忽视对内…

抖音企业号无需API开发连接AI图像生成,打造AI智能绘图助手

1. 抖音用户使用场景&#xff1a; 作为抖音企业号的运营人员&#xff0c;我们一直在寻找新的方式来增强我们与用户之间的互动。最近&#xff0c;我们发现了AI绘图技术可以根据用户需求和指令自动创建图片&#xff0c;无需人为干预&#xff0c;这为我们节省了人力和时间。因此&a…

node 如何下载任意版本

开门见山啦 第一步&#xff1a;打开node官网 Node.js 第二步&#xff1a;点击下载 进入下面的页面&#xff0c;然后往下滑&#xff0c;点击 All download options 查看以往所有的版本号&#xff1a; 这样就可以按自己的需求下载对应的node版本啦 或者 &#xff1a; 最简单…

后端面试话术集锦第 七 篇:nginx面试话术

这是后端面试集锦第七篇博文——nginx面试话术❗❗❗ 1. 介绍一下nginx Nginx是一个高性能的HTTP和反向代理服务器,具有反向代理和负载均衡以及动静分离等功能。 我先说说Nginx反向代理吧: 反向代理是指以代理服务器来接受用户的请求,然后将请求分发给内部网络上的服务器,…

论文阅读》用提示和释义模拟对话情绪识别的思维过程 IJCAI 2023

《论文阅读》用提示和复述模拟对话情绪识别的思维过程 IJCAI 2023 前言简介相关知识prompt engineeringparaphrasing模型架构第一阶段第二阶段History-oriented promptExperience-oriented Prompt ConstructionLabel Paraphrasing损失函数前言 你是否也对于理解论文存在困惑?…

Elasticsearch:为什么从 Elasticsearch 7.0.0 及更高版本中删除了映射类型 type?

在 Elasticsearch 7.0.0 或更高版本中创建的索引不再接受 _default_ 映射。 在 6.x 中创建的索引将继续在 Elasticsearch 6.x 中像以前一样运行。 7.0 中的 API 中已弃用类型 type&#xff0c;并对索引创建、放置映射、获取映射、放置模板、获取模板和获取字段映射 API 进行了重…