1.前言

ASP.NET Core在应用程序上引入Microsoft.Extensions.Configuration配置,可以支持多种方式配置,包括命令行配置、环境变量配置、文件配置、内存配置,自定义配置等等。下面我们就其中几个配置来聊聊。

2.命令行配置

CommandLineConfigurationProvider在应用程序运行时会从(例如DOS)命令行参数键值加载配置。要激活命令行配置,请在ConfigurationBuilder的实例上调用AddCommandLine扩展方法。使用CreateDefaultBuilder初始化新的WebHostBuilder时会自动调用AddCommandLine。

  1. public class Program
  2. {
  3. public static void Main(string[] args)
  4. {
  5. CreateWebHostBuilder(args).Build().Run();
  6. }
  7. public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
  8. WebHost.CreateDefaultBuilder(args)
  9. .ConfigureAppConfiguration((hostingContext, config) =>
  10. {
  11. // Call other providers here and call AddCommandLine last.
  12. config.AddCommandLine(args);
  13. }).UseStartup<Startup>();
  14. }

在Program加入上述代码并在/Home/Index视图上添加如下代码后发布一个Web版本挂载在IIS上。

在控制台上输入DOS命令行dotnet D:\Release\Core\TestWebApp.dll CommandLineKey1=value1配置键:CommandLineKey1,值:value1的信息,会看到如下界面信息:

根据控制台监听站点连接,在浏览器上打开其中一个,比如打开https://localhost:5001/,会看到我们配置命令行信息:

3.文件配置

FileConfigurationProvider是从文件系统加载配置的基类。以下配置为应用程序提供专用于特定文件类型:INI配置、JSON配置、XML配置。

3.1 INI配置

IniConfigurationProvider在运行时会从INI文件键值对加载配置。若要激活INI文件配置,请在 ConfigurationBuilder的实例上调用AddIniFile扩展方法,而冒号可用作INI文件配置中的节点分隔符。现在我们在CoreWeb根目录下添加一个INI配置文件(命名为config):

  1. [section0]
  2. key0=value
  3. key1=value
  4. [section1]
  5. subsection:key=value
  6. [section2:subsection0]
  7. key=value
  8. [section2:subsection1]
  9. key=value

而应用程序在构建主机时会调用ConfigureAppConfiguration以指定应用程序配置(这里我们指定config.ini文件):

  1. public class Program
  2. {
  3. public static void Main(string[] args)
  4. {
  5. CreateWebHostBuilder(args).Build().Run();
  6. }
  7. public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
  8. WebHost.CreateDefaultBuilder(args)
  9. .ConfigureAppConfiguration((hostingContext, config) =>
  10. {
  11. config.SetBasePath(Directory.GetCurrentDirectory());
  12. config.AddIniFile(
  13. "config.ini", optional: true, reloadOnChange: true);
  14. })
  15. .UseStartup<Startup>();
  16. }

从上述代码可以看到IConfigurationBuilder设置了文件访问初始路径。Optional:文件是否可选;reloadOnChange:如果文件更改,是否应重新加载配置。而通过启动应用程序时会看到如下配置信息:

3.2 JSON配置

JsonConfigurationProvider在运行时期间会从JSON文件键值对加载配置。若要激活JSON文件配置,请在ConfigurationBuilder的实例上调用AddJsonFile扩展方法。使用 CreateDefaultBuilder初始化新的WebHostBuilder时,会自动调用AddJsonFile两次,调用该方法(AddJsonFile)来从以下文件加载配置,首先会读取appsettings.json该文件。而应用程序启动时是会默认调用对应的appsettings.{Environment}.json环境版本的,例如appsettings.{Environment}.json会根据IHostingEnvironment.EnvironmentName加载对应文件的环境版本(开发模式、生产模式等)。现在我们在CoreWeb根目录下添加一个JSON配置文件(命名为config):

  1. {
  2. "section0": {
  3. "key0": "key0value",
  4. "key1": "key1value"
  5. },
  6. "section1": {
  7. "key0": "key0value",
  8. "key1": "key1value"
  9. },
  10. "section2": {
  11. "subsection0": {
  12. "key0": "sub0key0value",
  13. "key1": "sub0key1value"
  14. },
  15. "subsection1": {
  16. "key0": "sub1key0value",
  17. "key1": "sub1key1value"
  18. }
  19. }
  20. }

而应用程序在构建主机时会调用ConfigureAppConfiguration以指定除appsettings.json和appsettings.{Environment}.json以外文件的应用程序配置(这里我们指定config.json文件):

  1. public class Program
  2. {
  3. public static void Main(string[] args)
  4. {
  5. CreateWebHostBuilder(args).Build().Run();
  6. }
  7. public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
  8. WebHost.CreateDefaultBuilder(args)
  9. .ConfigureAppConfiguration((hostingContext, config) =>
  10. {
  11. config.SetBasePath(Directory.GetCurrentDirectory());
  12. config.AddJsonFile(
  13. "config.json", optional: true, reloadOnChange: true);
  14. })
  15. .UseStartup<Startup>();
  16. }

而通过启动应用程序时会看到如下配置信息:

从上述信息可以看到,在我们指定config.json文件后,IConfigurationBuilder会额外多调用一次AddJsonFile,加上前两次AddJsonFile,一共是三次。

3.2.1GetSection、GetChildren和Exists

(1)GetSection:IConfiguration.GetSection获取指定配置子节。下面我们通过一个示例来了解下:

  1. public Startup(IConfiguration configuration)
  2. {
  3. Configuration = configuration;
  4. var configSection0 = Configuration.GetSection("section0");
  5. var configSection1 = Configuration.GetSection("section0:key0");
  6. }

而通过启动应用程序时会看到如下配置信息:

通过上述示例可以看到,IConfiguration.GetSection仅仅是获取到json数据里面configSection0节点键和路径,并没有获取到它的节点值。若要获取section0:key0中的键值,请在调用GetSection时提供完整节点路径,如获取configSection1键值示例。
(2)GetChildren:获取指定配置树节点。下面我们通过一个示例来了解下:

  1. public Startup(IConfiguration configuration)
  2. {
  3. Configuration = configuration;
  4. var configSection = Configuration.GetSection("section2");
  5. var children = configSection.GetChildren();
  6. }

而通过启动应用程序时会看到如下配置信息:

GetChildren获取了指定section2节点下所有节点。
(3)Exists:使用ConfigurationExtensions.Exists确定配置节点是否存在。下面我们通过一个示例来了解下:

  1. public Startup(IConfiguration configuration)
  2. {
  3. Configuration = configuration;
  4. var sectionExists0 = Configuration.GetSection("section2").Exists();//true
  5. var sectionExists1 = Configuration.GetSection("section2:subsection2").Exists();//false
  6. }

而通过启动应用程序时会了解到section2配置节点如果存在就会返回true,反之则false;同理section2:subsection2路径配置节点亦一样。

3.3 XML配置

XmlConfigurationProvider在运行时会从XML文件键值对加载配置。若要激活XML文件配置,请在ConfigurationBuilder的实例上调用AddXmlFile扩展方法。现在我们在CoreWeb根目录下添加一个XML配置文件(命名为config):

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3. <section0>
  4. <key0>value</key0>
  5. <key1>value</key1>
  6. </section0>
  7. <section1>
  8. <key0>value</key0>
  9. <key1>value</key1>
  10. </section1>
  11. </configuration>

而应用程序在构建主机时调用ConfigureAppConfiguration以指定应用程序的配置(这里我们指定config.xml文件):

  1. public class Program
  2. {
  3. public static void Main(string[] args)
  4. {
  5. CreateWebHostBuilder(args).Build().Run();
  6. }
  7. public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
  8. WebHost.CreateDefaultBuilder(args)
  9. .ConfigureAppConfiguration((hostingContext, config) =>
  10. {
  11. config.SetBasePath(Directory.GetCurrentDirectory());
  12. config.AddXmlFile(
  13. "config.xml", optional: true, reloadOnChange: true);
  14. })
  15. .UseStartup<Startup>();
  16. }

而通过启动应用程序时会看到如下配置信息:

参考文献:
ASP.NET Core 中的配置

(11)ASP.NET Core 中的配置一(Configuration)的更多相关文章

  1. 3、带你一步一步学习ASP.NET Core中的配置之Configuration

    如果你是刚接触ASP.NET Core的学习的话,你会注意到:在ASP.NET Core项目中,看不到.NET Fraemwork时代中的web.config文件和app.config文件了.那么你肯 ...

  2. (12)ASP.NET Core 中的配置二(Configuration)

    1.内存配置 MemoryConfigurationProvider使用内存中集合作为配置键值对.若要激活内存中集合配置,请在ConfigurationBuilder的实例上调用AddInMemory ...

  3. 聊聊ASP.NET Core中的配置

    ​作为软件开发人员,我们当然喜欢一些可配置选项,尤其是当它允许我们改变应用程序的行为而无需修改或编译我们的应用程序时.无论你是使用新的还是旧的.NET时,可能希望利用json文件的配置.在这篇文章中, ...

  4. 翻译 - ASP.NET Core 基本知识 - 配置(Configuration)

    翻译自 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/configuration/?view=aspnetcore-5.0 ASP ...

  5. ASP.NET Core 中的配置

    目录 以键-值对的形式读取配置 多环境配置 读取结构化的配置数据 参考 .NET Core 定义配置的方式不同于之前 NET 版本,之前是依赖于 System.Configuration 的 app. ...

  6. ASP.NET Core 学习笔记 第四篇 ASP.NET Core 中的配置

    前言 说道配置文件,基本大多数软件为了扩展性.灵活性都会涉及到配置文件,比如之前常见的app.config和web.config.然后再说.NET Core,很多都发生了变化.总体的来说技术在进步,新 ...

  7. ASP.NET Core中的配置

    配置 参考文件点击跳转 配置来源 命令行参数 自定义提供程序 目录文件 环境变量 内存中的.NET 对象 文件 默认配置 CreateDefaultBuilder方法提供有默认配置,在这个方法中会接收 ...

  8. ASP.NET Core开发-如何配置Kestrel 网址Urls

    ASP.NET Core中如何配置Kestrel Urls呢,大家可能都知道使用UseUrls() 方法来配置. 今天给介绍全面的ASP.NET Core 配置 Urls,使用多种方式配置Urls. ...

  9. ASP.NET Core中如何调整HTTP请求大小的几种方式

    一.前言 一般的情况下,我们都无需调用HTTP请求的大小,只有在上传一些大文件,或者使用HTTP协议写入较大的值时(如调用WebService)才可能会调用HTTP最大请求值. 在ASP.NET Co ...

随机推荐

  1. Spring之bean后处理器

    Bean后处理器是一种特殊的Bean,容器中所有的Bean在初始化时,均会自动执行该类的两个方法.由于该Bean是由其它Bean自动调用执行,不是程序员手工调用,故此Bean无须id属性.需要做的是, ...

  2. abp(net core)+easyui+efcore仓储系统——创建应用服务(五)

    abp(net core)+easyui+efcore仓储系统目录 abp(net core)+easyui+efcore仓储系统——ABP总体介绍(一) abp(net core)+easyui+e ...

  3. Django框架rest_framework中APIView的as_view()源码解析、认证、权限、频率控制

    在上篇我们对Django原生View源码进行了局部解析:https://www.cnblogs.com/dongxixi/p/11130976.html 在前后端分离项目中前面我们也提到了各种认证需要 ...

  4. 【转载】一起来学Spring Cloud | Eureka Client注册到Eureka Server的秘密

    LZ看到这篇文章感觉写得比较详细,理解以后,便转载到自己博客中,留作以后回顾学习用,喝水不忘挖井人,内容来自于李刚的博客:http://www.spring4all.com/article/180 一 ...

  5. C语言类型转换

    int/float to string/array: C语言提供了几个标准库函数,可以将任意类型(整型.长整型.浮点型等)的数字转换为字符串,下面列举了各函数的方法及其说明. itoa():将整型值转 ...

  6. HDU 1025:Constructing Roads In JGShining's Kingdom(LIS+二分优化)

    http://acm.hdu.edu.cn/showproblem.php?pid=1025 Constructing Roads In JGShining's Kingdom Problem Des ...

  7. 通过字节码分析java中的switch语句

    在一次做题中遇到了switch的问题,由于对switch执行顺序的不了解,在这里简单的通过字节码的方式理解一下switch执行顺序(题目如下): public class Ag{ static pub ...

  8. Spring 核心技术(3)

    接上篇:Spring 核心技术(2) version 5.1.8.RELEASE 1.4 依赖 典型的企业应用程序不会只包含单个对象(或 Spring 术语中的 bean).即使是最简单的应用程序也是 ...

  9. 【Spring容器】项目启动后初始化数据的两种实践方案

    早期业务紧急,没有过多的在意项目的运行效率,现在回过头看走查代码,发现后端项目(Spring MVC+MyBatis)在启动过程中多次解析mybatis的xml配置文件及初始化数据,对开发阶段开发人员 ...

  10. 《Graph Neural Networks: A Review of Methods and Applications》阅读笔记

    本文是对文献 <Graph Neural Networks: A Review of Methods and Applications> 的内容总结,详细内容请参照原文. 引言 大量的学习 ...