一.  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位移运算符2 转

    https://blog.csdn.net/xxx134617/article/details/7454774 java中int类型占4个字节,二进制用补码表示: 3的二进制表示: 00000000 ...

  2. Shell脚本学习 - 运算符

    继续shell脚本学习.上一篇是基本数据类型和语法的总结,这一篇是运算相关的操作. 运算符 bash不支持简单的数学计算,需要依赖其他命令实现. expr可以代为实现. # 表达式一般这么写 ` + ...

  3. scrapy递归解析和post请求

    递归解析 递归爬取解析多页页面数据 每一个页面对应一个url,则scrapy工程需要对每一个页码对应的url依次发起请求,然后通过对应的解析方法进行作者和段子内容的解析. 实现方案: 1.将每一个页码 ...

  4. Do Now 一个让你静心学习的APP——团队博客

    Do Now 一个让你静心学习的APP 来自油条只要半根团队的智慧凝聚的产物! 团队博客总目录: 团队作业第一周 团队作业第二周 Do Now -- 团队冲刺博客一 Do-Now-团队Scrum 冲刺 ...

  5. String.matches()的用法

    https://blog.csdn.net/victoryckl/article/details/6930409

  6. error C2371: 'IServiceProvider' : redefinition; different basic types

    需要将#include <windows.h>放到using namespace System;前面. #include <windows.h>using namespace ...

  7. 20175324 《Java程序设计》第七周学习总结

    教材学习内容总结 常用实用类 String类 - 程序可以直接使用String类,但不能进行扩展,即String类不可以有子类 - 常用构造方法 - String(char a[])用一个字符数组a创 ...

  8. CSS-默认padding 和 margin

    一.h1~h6标签:有默认margin(top,bottom且相同)值,没有默认padding值. 在chrome中:16,15,14,16,17,19; 在firefox中:16,15,14,16, ...

  9. 排查MongoDB CPU使用率高的问题

    1.公司业务调整,把一部分数据由Redis转至MongoDB,业务在测试环境正常,生产环境上线后发现压力一上来MongoDB的服务直接把CPU占满了,和开发的同学分析了一下也参考了一下百度上类似的问题 ...

  10. Linux 系统中的内部与外部命令

    linux中的命令大致可分为两类,内部命令和外部命令: 内部命令(builtin command):也称shell内嵌命令 外部命令(external command):存放在一个文件中,使用时需要去 ...