当前位置: 首页 > news >正文

AspNetCore中的配置文件详解

1 配置文件

程序开发中,有些信息是要根据环境改变的,比如开发环境的数据库可能是本地数据,而生产环境下需要连接生产数据库,我们需要把这些信息放到程序外面,在程序运行时通过读取这些外部信息实现不改变程序代码适应不同环境的需求,这些信息就是“配置”。
在AspNetCore中,最常见的配置文件就是appsetings.json,和appsettings.{enviroment}.json。配置数据以json的方式存储在外部的json文档中。除此之外,还提供其他的配置数据源 【不同的ConfigurationProvider】,允许系统从多个配置源中读取配置文件,如环境变量或者系统内存。

2 配置源与配置读取规则

针对配置涉及三个对象,它们分别是Configuration、ConfigurationBuilder和ConfigurationProvider。

  • Configuration对象承载着在编程过程中使用的配置信息,在AspNetCore中,配置功能通常通过在构造函数中注入IConfiguration来实现;
  • ConfigurationProvider则是配置信息原始数据源的提供者;
  • ConfigurationBuilder它利用ConfigurationProvider提取源数据将其转换为Configuration对象。

AspNetCore中的配置数据源包括
MemoryConfigurationProvider: 从内存中读取配置
JsonConfigurationProvider:从json文档中读取配置
EnvironmentVariablesConfigurationProvider:从系统环境变量中读取配置
CommandLineConfigurationProvider:从运行命令行中读取配置
等。

在同时处在多个数据源的情形下,配置数据的读取数据又会是什么样呢?
这个问题不需要我们去担心。在构建AspNetCore项目时,将会在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.UseStartup<Startup>();});}

按照以下顺序为应用提供默认配置(从最高优先级到最低优先级):

(1)使用命令行配置提供程序通过命令行参数提供。
(2)使用非前缀环境变量配置提供程序通过非前缀环境变量提供。
(3)应用在 环境中运行时的用户机密。
(4)使用 JSON 配置提供程序通过 appsettings.{Environment}.json 提供。 例如,appsettings.Production.json 和 appsettings.Development.json。
(5)使用 JSON 配置提供程序通过 appsettings.json 提供。

这意味着,多个配置源中存在同样的key 节点时,会按照配置的优先级别覆盖。
如在开发环境中,appsettings.Development.json 配置会覆盖在 appsettings.json 中找到的值。因为级别大于4

3 配置数据结构与读取配置数据

真实项目中涉及的配置大都具有一个结构化的层次结构,所以在配置模型中的Configuration对象同样具有这样的结构。尽管数据源不同,但是经过ConfigurationBuilder处理后,配置信息将以统一的配置树的逻辑结构进行存储。

而一个Configuration对象表示的是组成这棵配置树的某个节点,这棵配置树则可以通过作为根节点的Configuration对象来体现。体现为键值对的原子配置项一般至存在于作为叶子节点的Configuration对象中,非叶子节点的Configuration包含一组子节点,而每个子节点同样是一个Configuration对象。

在这里插入图片描述

配置信息逻辑上以树形结构存储,实际在内存中是以字典【Dictionary】键值对的形式存储。Key是每个配置项所在配置节在配置树中的路径,路径采用冒号(“:”)进行分割。 以appsettings.json 为例,可通过configuration[key]取出配置的信息

{"Logging": {"LogLevel": {"Default": "Information","Microsoft": "Warning","Microsoft.Hosting.Lifetime": "Information"}},"AllowedHosts": "*"
}
//注入配置服务IConfigurationpublic void Configure(IApplicationBuilder app, IWebHostEnvironment env,IConfiguration configuration){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}app.UseRouting();app.UseEndpoints(endpoints =>{endpoints.MapGet("/", async context =>{//浏览器读取json文档中的配置数据并输出: //key 为节点所在数的路径,以" :"作为分隔符await context.Response.WriteAsync(configuration["Logging:LogLevel:Default"].ToString()+"\n");await context.Response.WriteAsync(configuration["Logging:LogLevel:Microsoft.Hosting.Lifetime"].ToString()+"\n");await context.Response.WriteAsync(configuration["AllowedHosts"].ToString()+"\n");});});}

4 配置与环境

根据AspNetCore默认值设置的配置优先级可知,配置文件的读取还与系统的环境有关。并且,在实际开发中会根据环境变量的不同设置不同的配置信息。所以环境的设置是很重要的。

在AspNetCore 中,在开发状态时,可以根据launchSettings.json 文件来设定加载的环境
在这里插入图片描述
也可以设置本地系统环境变量
在这里插入图片描述
通常可设定的环境值有 Developmet 、Production、Staging。而在项目发布后,通常为了程式的安全性能,默认读取的是Production的环境。不能通过修改launchSettings.json文件来决定发布后项目的环境值。

http://www.lryc.cn/news/68289.html

相关文章:

  • 实时更新天气微信小程序开发
  • css渐变
  • 《斯坦福数据挖掘教程·第三版》读书笔记(英文版) Chapter 2 MapReduce and the New Software Stack
  • HTML零基础快速入门(详细教程)
  • Kubernetes第5天
  • RK3568平台开发系列讲解(调试篇)debugfs 分析手段
  • 【Spring框架全系列】SpringBoot配置日志文件
  • 事务 ---MySQL的总结(六)
  • 22 标准模板库STL之容器适配器
  • 目标检测YOLO实战应用案例100讲-基于深度学习的自动驾驶目标检测算法研究
  • 服务网关Gateway
  • (4)定时器
  • 项目实现读写分离操作(mysql)
  • VP记录:Educational Codeforces Round 148 (Rated for Div. 2) A~D1
  • 无线模块|如何选择天线和设计天线电路
  • (11)LCD1602液晶显示屏
  • 类和对象下
  • 【云计算•云原生】4.云原生之什么是Kubernetes
  • 云厂商降价潮背后:来中小企业战场「拼刺刀」
  • 2-单片机GPIO相关知识点及流水灯和按键采集小实验
  • 基础知识(王爽老师书第一章)
  • 非煤矿山电子封条建设算法 yolov8
  • 七大软件架构设计原则详解
  • 【Python入门】Python循环语句(while循环的嵌套应用)
  • 数据来源和搜集
  • Python入门(七)if语句(二)
  • [元带你学: eMMC完全解读 2] eMMC协议相关术语与定义
  • 预测杭州五一黄金周的旅游出行人数
  • 内防泄密重要,还是外防窃密重要?
  • ChatGPT:2. 使用OpenAI创建自己的AI网站:1. 初探API