一.  ASP.NET Core 中的配置概述

  ASP.NET Core 中的应用配置是基于键值对,由configuration 程序提供。 configuration  将从各种配置源提供程序操作键值对,这些配置源可以是:

    (1) Azure Key Vault(是基于云的服务的安全存储应用机密)

    (2) 命令行参数

    (3)(已安装或已创建的)自定义提供程序(自定义实现IConfigurationSource)

    (4) 目录文件(Key-per-file)

    (5) 环境变量(EnvironmentVariables)

    (6) 内存中的 .NET 对象

    (7) 设置文件(从文件系统加载配置)

  configuration 程序提供配置依赖于以下内容,本章后面都会介绍具体使用:

    (1) 使用 SetBasePath 设置应用程序的基本路径。 通过引用 Microsoft.Extensions.Configuration.FileExtensions 包,可以向应用提供 SetBasePath。

    (2) 使用 GetSection 解析配置文件的各个部分。 通过引用 Microsoft.Extensions.Configuration 包向应用提供 GetSection。

    (3) 使用 Bind 和 Get<T> 将配置绑定到 .NET 类。 通过引用 Microsoft.Extensions.Configuration.Binder 包向应用提供 Bind 和 Get<T>。 ASP.NET Core 1.1 或更高版本中提供了 Get<T>。

  1.1 文件分层结构数据

通过configuration  api 能够通过在配置键中使用分隔符来保持分层配置数据。说明白点就是约定的数据结构。通过configuration  api的GetSection 和 GetChildren 方法可用于读取配置数据中某节点的值,下面简单先演示下效果。示例在 appsettings.json文件中添加section 节点的结构化键值对。如下所示:

{
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
"mykey": "d", "section0": {
"key0": "value",
"key1": "value"
},
"section1": {
"key0": "value",
"key1": "value"
}
}
    public class Page1Model : PageModel
{
//using Microsoft.Extensions.Configuration;
public Page1Model(IConfiguration configuration)
{
Configuration = configuration;
} public IConfiguration Configuration { get; } public void OnGet()
{
string val = Configuration.GetSection("section0").GetSection("key0").Value;
//val 值为: value
}
}

  在OtherPages/page1中读取上面文件中的节点。上面通过服务的实现的IConfiguration并没有在程序中显示读取appsettings.json文件,那为什么能读出到该文件的键值对呢? 本章带着这个问题在继续了解。

  1.2 配置约定

    应用的依赖关系注入 (DI) 容器中提供了 IConfiguration。在程序应用启动时,IConfiguration将按照指定的配置文件顺序读取配置源。

    1) 配置来源中的键有以下约定:

      (1) 键不区分大小写。比如能过GetSection读取时,可以不管大小写。

      (2) 配置来源中设置相同键的值,则取配置来源中键上设置的最后一个值。比如appsettings.json与appsettings.{Environment}.json多个配置来源文件。

      (3) 分层键。如在json文件中多个节点,冒号分隔符 (:) 适用于所有平台。而在环境变量的来源配置中,所有平台均支持采用双下划线 (__)。

      (4) ConfigurationBinder 支持使用配置键中的数组索引将数组绑定到类对象。

    2) 配置值采用以下约定:

      (1) 值是字符串。

      (2) NULL 值不能存储在配置中或绑定到对象。

  1.3 配置来源提供程序的顺序

    对于上面的7种配置来源提供程序,IConfiguration操作的顺序是按照启动时指定的配置顺序操作配置源。在ConfigureAppConfiguration代码中设置的配置源提供程序,应以特定顺序排列以符合基础配置源的优先级。典型顺序为:

    (1) 文件(appsettings.json、appsettings.{Environment}.json,其中 {Environment} 是应用的当前托管环境)。

    (2) Azure 密钥保管库。

    (3) 用户机密 (Secret Manager)(仅限开发环境中)。

    (4) 环境变量。

    (5) 命令行参数。

    通常的做法是将命令行配置提供程序置于一系列提供程序的末尾,以允许命令行参数替代由其他提供程序设置的配置。在使用 CreateDefaultBuilder 初始化新的 WebHostBuilder 时,将使用此提供程序序列。

    上面讲到为什么会自动读取appsettings.json文件瞒下的伏笔。在这里有了答案。Configuration提供程序默认会读取appsettings.json、appsettings.{Environment}.json。

    

  1.4 ConfigureAppConfiguration 添加配置提供程序

     构建 Web 主机时调用 ConfigureAppConfiguration 以指定应用的配置提供程序以及 CreateDefaultBuilder 自动添加的配置提供程序:

        public static Dictionary<string, string> arrayDict = new Dictionary<string, string>
{
{"array:entries:0", "value0"},
{"array:entries:1", "value1"},
{"array:entries:2", "value2"},
{"array:entries:4", "value4"},
{"array:entries:5", "value5"}
}; /// <summary>
/// Configuration Providers示例
/// </summary>
/// <param name="args"></param>
/// <returns></returns>
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
//显示设置当前程序运行目录
config.SetBasePath(Directory.GetCurrentDirectory());
//设置内存中的 .NET 对象
config.AddInMemoryCollection(arrayDict);
//设置文件, optional选择项为false时 必需存在该文件
config.AddJsonFile("json_array.json", optional: false, reloadOnChange: false);
config.AddJsonFile("starship.json", optional: true, reloadOnChange: false);
config.AddXmlFile("tvshow.xml", optional: true, reloadOnChange: false);
//EF以后在讲 自定义提供程序
// config.AddEFConfiguration(options => options.UseInMemoryDatabase("InMemoryDb"));
//最后设置命令行参数
config.AddCommandLine(args);
})
.UseStartup<Startup>();

二. 命令行配置提供程序 AddCommandLine

  CommandLineConfigurationProvider 在运行时从命令行参数键值对加载配置,要激活命令行配置,请在 ConfigurationBuilder 的实例上调用 AddCommandLine 扩展方法。 如果需要使用命令行参数覆盖其它配置,请在 ConfigureAppConfiguration 中调用应用的其他提供程序并最后调用 AddCommandLine。

  下面示例,使用控制台作为启动程序。打开cmd  输入dotnet命令,在后面输入命令行配置参数CommandLineKey1=value1, 在浏览器page2中显示该命令行配置value值。

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostingContext, config) =>
{
// Call other providers here and call AddCommandLine last.
config.AddCommandLine(args);
})
.UseStartup<Startup>();
    -- page2页面获取命令行
@using Microsoft.Extensions.Configuration;
@inject IConfiguration Configuration;
<p>Configuration CommandLine value for 'key':@Configuration["CommandLineKey1"] </p>

    2.1 命令行配置自变量示例 
    dotnet run CommandLineKey1=value1 --CommandLineKey2=value2 /CommandLineKey3=value3
    dotnet run --CommandLineKey1 value1 /CommandLineKey2 value2
    dotnet run CommandLineKey1= CommandLineKey2=value2

    

    2.2 交换映射

    交换映射字典键规则:(1)交换必须以单划线 (-) 或双划线 (--) 开头 。(2) 交换映射字典不得包含重复键。下面是一个示例:

       public static readonly Dictionary<string, string> _switchMappings =
new Dictionary<string, string>
{
{ "-CLKey1", "CommandLineKey1" },
{ "-CLKey2", "CommandLineKey2" }
};
      config.AddCommandLine(args, _switchMappings);

    创建交换映射字典后,它将包含下表所示的数据。

-CLKey1 CommandLineKey1
-CLKey2 CommandLineKey2

    

三. 环境变量配置提供程序 AddEnvironmentVariables

  EnvironmentVariablesConfigurationProvider 在运行时从环境变量键值对加载配置。要激活环境变量配置,请在 ConfigurationBuilder 的实例上调用 AddEnvironmentVariables 扩展方法。

  环境变量配置提供程序是在用户机密 (Secret Manager)和 appsettings.json 文件建立后调用。 调用AddEnvironmentVariables方法具有重载, 如果调用没有给前缀参数,则具有表中所示前缀的环境变量将加载到应用中。 如果有向 AddEnvironmentVariables 提供前缀,将筛选加载到应用的配置中的环境变量。

  下面示例为 AddEnvironmentVariables 方法提供前缀,添加要筛选前缀 ASPNETCORE_上的环境变量。将筛选加载到应用的配置中的环境变量。

    //添加具有指定前缀的环境变量的配置值。
config.AddEnvironmentVariables(prefix: "ASPNETCORE_");

  下面显示的是ASPNETCORE_为前缀的主机的配置信息。主机配置格式 ASPNETCORE_{configurationKey} 的环境变量。 例如 ASPNETCORE_ENVIRONMENT。关于ASPNETCORE_前缀的环境信息可参考“主机配置值”。下面是Configuration从查看ASPNETCORE_为前缀的主机的配置信息。

参考文献

官方资料:asp.net core 配置

asp.net core 系列 10 配置configuration (上)的更多相关文章

  1. asp.net core 系列 11 配置configuration (下)

    四. 文件配置提供程序AddIniFile. AddXmlFile.AddJsonFile FileConfigurationProvider 是从文件系统加载配置的基类. 以下配置提供程序专用于特定 ...

  2. asp.net core系列 49 Identity 授权(上)

    一.概述 授权是指用户能够访问资源的权限,如页面数据的查看.编辑.新增.删除.导出.下载等权限.ASP.NET Core 授权提供了多种且灵活的方式,包括:Razor pages授权约定.简单授权.R ...

  3. 【目录】asp.net core系列篇

    随笔分类 - asp.net core系列篇 asp.net core系列 68 Filter管道过滤器 摘要: 一.概述 本篇详细了解一下asp.net core filters,filter叫&q ...

  4. asp.net core 系列 16 Web主机 IWebHostBuilder

    一.概述 在asp.net core中,Host主机负责应用程序启动和生存期管理.host主机包括Web 主机(IWebHostBuilder)和通用主机(IHostBuilder).Web 主机是适 ...

  5. asp.net core 系列之Configuration

    在ASP.NET Core中的App configuration 是通过configuration providers基于key-value对建立的.Configuration providers读取 ...

  6. (11)ASP.NET Core 中的配置一(Configuration)

    1.前言 ASP.NET Core在应用程序上引入Microsoft.Extensions.Configuration配置,可以支持多种方式配置,包括命令行配置.环境变量配置.文件配置.内存配置,自定 ...

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

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

  8. 【asp.net core 系列】10 实战之ActionFilter

    0.前言 在上一篇中,我们提到了如何创建一个UnitOfWork并通过ActionFilter设置启用.这一篇我们将简单介绍一下ActionFilter以及如何利用ActionFilter,顺便补齐一 ...

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

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

随机推荐

  1. JAVA基础复习与总结<九> 线程的基本概念_Thread继承创建线程

    多线程 一.线程的概念 1.1 程序.进程.线程 程序:Program 是一个静态的概念 进程:Process 是一个动态的概念 进程是程序的一次动态执行过程,占用特定的地址空间. 每个进程都是独立的 ...

  2. JS精度问题(0.1+0.2 = 0.3吗?)

    一.引出问题 0.1+0.2 = 0.3吗?在JS中是这样的吗?我们写个测试代码不就知道了吗? 结果出人意料,并不像我们所想象的那样.那么这到底是为什么呢? 二.原因分析 JS浮点数存储机制: 三.解 ...

  3. 3A

    # -*- coding: utf-8 -*- import datetime, time, heapq, cx_Oracle #2rd sheet def get_5mins_3A_LOG(): c ...

  4. 实现简单的promise

    只考虑成功时的调用,方便理解一下promise的原理promise的例子: 1. 接下来一步步实现一个简单的promise step1:promise 接受一个函数作为构造函数的参数,是立即执行的,并 ...

  5. 打包java程序生成exe

    打包java程序生成exe 目标 我们知道c++的控制台程序编译运行以后就会生成一个exe可执行文件,在电脑上可以直接双击运行,但是java是跨平台的语言,编译运行以后的字节码文件.class是和平台 ...

  6. 针对Oracle用户被锁的一些相关处理方法

    当登录时被告知XXX用户被锁时,可进行以下操作: 1.用拥有dba权限的用户登录,进行解锁,先设置具体时间格式,方便后面查看被锁的具体时间: SQL> alter session set nls ...

  7. Java_Object

    说一下java中的Object类. 1.Object: Object是java类库中的一个特殊类,也是所有类的父类. Object类定义了一些有用的方法,由于是根类,这些方法在其他类中都存在,一般是进 ...

  8. centOS7上编译hadoop-2.7.7

    一.阅读编译文档 在hadoop源码包根目录下有个一个BUINDING.txt的文件,文件说明了编译hadoop所需要的一些编译hadoop所需要的一些编译环境相关的东西.不同hadoop版本的要求都 ...

  9. cadence网络表解读及导入

    绘制完成原理图,并且通过了DRC检验之后,需要创建和导入网络表,下面网络表内容做简单总结.

  10. 企业IT管理员IE11升级指南【12】—— 兼容视图列表介绍

    企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...