升级ASP.NET Core后,配置的读取是第一个要明确的技术。原先的App.Config、Web.Config、自定义Config在ASP.NET Core中如何正常使用。有必要好好总结整理一下,相信大家都会用到。

首先,看一下ASP.NET Core中的配置提供程序(Configuration Providers):

一、配置提供程序(Configuration Providers)

ASP.NET Core 使用一个或多个配置提供程序来读取配置:

  • 应用程序设置文件(配置文件),例如appsettings.json
  • 环境变量:Environment variables
  • 命令行参数:Command-line arguments
  • 自定义的配置提供程序
  • 目录文件
  • 内存中的.NET对象(内存中的配置类)
  • Azure Key Vault,详细说明参考这个连接:https://docs.microsoft.com/en-us/aspnet/core/security/app-secrets?view=aspnetcore-3.0&tabs=windows
  • Azure应用程序配置:Azure App Configuration

我们通过下面的代码,输出配置提供程序的加载顺序:

var configRoot = (IConfigurationRoot)Configuration;
foreach (var provider in configRoot.Providers.ToList())
{
Debug.WriteLine(provider.ToString() + "\n");
}

 输出有5个:

  • Microsoft.Extensions.Configuration.ChainedConfigurationProvider:链式的配置提供程序,可以添加已有的IConfiguration,作为一个配置源
  • JsonConfigurationProvider for 'appsettings.json' (Optional):读取appsettings.json文件
  • JsonConfigurationProvider for 'appsettings.Development.json' (Optional):按环境读取不同的appsettings.json文件,例如appsettings.Development.json、appsettings.Production.json
  • EnvironmentVariablesConfigurationProvider:读取环境变量
  • CommandLineConfigurationProvider:读取命令行参数配置

接下来我们我们重点介绍“应用程序配置文件”,“环境变量”,“命令行参数”,“app.config” 这四种最常用的配置读取方式,通过代码的方式,示例给大家:

二、读取应用程序设置文件appsettings.json

我们使用ASP.NET Core工程中默认的appsettings.json文件

{
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft": "Warning",
"Microsoft.Hosting.Lifetime": "Information"
}
},
"AllowedHosts": "*"
}

通过代码读取配置

var allowedHosts = Configuration["AllowedHosts"];
var defaultLogLevel = Configuration["Logging:LogLevel:Default"];
Debug.WriteLine("allowedHosts:" + allowedHosts + "\n");
Debug.WriteLine("defaultLogLevel:"+defaultLogLevel + "\n");

实际输出:

allowedHosts:*

defaultLogLevel:Information

如果想读取整个的LogLevel对象,如何实现?

新建LogLevel类和Logging类

   [DataContract]
public class LogLevel
{
[DataMember(Name = "Default")]
public string Default { get; set; } [DataMember(Name = "Microsoft")]
public string Microsoft { get; set; } [DataMember(Name ="Microsoft.Hosting.Lifetime")]
public string MicrosoftHostingLifetime { get; set; } } [DataContract]
public class Logging
{
[DataMember]
public LogLevel LogLevel { get; set; }
}

  读取Logging配置示例代码:

Logging logConfig = new Logging();
Configuration.GetSection("Logging").Bind(logConfig);
var lifetime = Configuration["Logging:LogLevel:Microsoft.Hosting.Lifetime"];
logConfig.LogLevel.MicrosoftHostingLifetime = lifetime;

上述代码中,对Lifetime属性的设置,通过以下方式实现,Bind的方式因为key匹配的问题,无法完成匹配。

     Configuration["Logging:LogLevel:Microsoft.Hosting.Lifetime"];

     这个地方补充一个带环境类型的应用设置文件的价值顺序:比如说按环境分appsettings.json文件

默认的JsonConfigurationProvider ,按以下顺序加载 appsettings.json文件:

① appsettings.json
    ② appsettings.Environment.json,例如appsettings.Development.json ,appsettings.Production.json

关于appsettings.Environment.json,Environment的设置主页在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.UseEnvironment("Development");
webBuilder.UseStartup<Startup>();
});
}

三、环境变量读取

按照配置的加载顺序,EnvironmentVariablesConfigurationProvider从环境变量中读取配置信息,在appsettings.json和Secret manager读取配置之后。

这个地方有个分隔符的注意点,因为 :并不是在所有平台上都支持,建议统一使用__(双下划线),运行时会将__统一替换为:

先通过以下命令,设置环境变量:

set Key1="Value1"
set Logging__LogLevel__Customer=Information

   代码中读取环境变量的配置

 public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureAppConfiguration((hostBuilder, config) =>
{
config.AddEnvironmentVariables();
})
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseEnvironment("Development");
webBuilder.UseStartup<Startup>();
});

  修改Startup中Configure方法:读取配置并输出

var key1Value = Configuration["Key1"];
var logLevel = Configuration["Logging:LogLevel:Customer"];
Console.WriteLine("key1Value:" + key1Value + "\n");
Console.WriteLine("logLevel:" + logLevel + "\n");

  

四、命令行参数读取

命令行配置提供程序CommandLineConfigurationProvider,将在以下配置源之后从命令行参数键值对加载配置:

  1. appsettings.json和appsettings。Environment。json文件
  2. 开发环境中的应用程序机密(秘密管理器)
  3. 环境变量

继续使用第三章中的示例工程,新建CMD命令行,输入以下dotnet run指令:

dotnet run Key1="Value1"  Logging:LogLevel:Customer="Information"

  

五、app.config读取

这个场景最大的作用就是兼容原有ASP.NET Web.Config文件!

首先添加Nuget引用:System.Configuration.ConfigurationManager

新增app.config文件:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
<appSettings>
<add key="ConfigKey1" value="Value" />
</appSettings>
</configuration>

使用原有ConfigurationManager读取配置:

var value = System.Configuration.ConfigurationManager.AppSettings["ConfigKey1"];
Console.WriteLine("ConfigKey1:" + value + "\n");

以上就是ASP.NET Core常用的“应用程序配置文件”,“环境变量”,“命令行参数”,“app.config” 配置读取方式,分享给大家。

周国庆

2020/4/1

.NET Core技术研究-配置读取的更多相关文章

  1. .NET Core技术研究系列-索引篇

    随着.NET Core相关技术研究的深入,现在将这一系列的文章,整理到一个索引页中,方便大家翻阅查找,同时,后续也会不断补充进来. .NET Core技术研究-WebApi迁移ASP.NET Core ...

  2. .NET Core技术研究-主机

    前一段时间,和大家分享了 ASP.NET Core技术研究-探秘Host主机启动过程 但是没有深入说明主机的设计.今天整理了一下主机的一些知识,结合先前的博文,完整地介绍一下.NET Core的主机的 ...

  3. ASP.NET Core技术研究-全面认识Web服务器Kestrel

    因为IIS不支持跨平台的原因,我们在升级到ASP.NET Core后,会接触到一个新的Web服务器Kestrel.相信大家刚接触这个Kestrel时,会有各种各样的疑问. 今天我们全面认识一下ASP. ...

  4. .Net Core技术研究-WebApi迁移ASP.NET Core2.0

    随着ASP.NET Core 2.0发布之后,原先运行在Windows IIS中的ASP.NET WebApi站点,就可以跨平台运行在Linux中.我们有必要先说一下ASP.NET Core. ASP ...

  5. ASP.NET Core技术研究-探秘Host主机启动过程

    当我们将原有ASP.NET 应用程序升级迁移到ASP.NET Core之后,我们发现代码工程中多了两个类Program类和Startup类. 接下来我们详细探秘一下通用主机Host的启动过程. 一.P ...

  6. .NET Core技术研究-中间件的由来和使用

    我们将原有ASP.NET应用升级到ASP.NET Core的过程中,会遇到一个新的概念:中间件. 中间件是ASP.NET Core全新引入的概念.中间件是一种装配到应用管道中以处理请求和响应的软件.  ...

  7. .NET Core技术研究-通过Roslyn代码分析技术规范提升代码质量

    随着团队越来越多,越来越大,需求更迭越来越快,每天提交的代码变更由原先的2位数,暴涨到3位数,每天几百次代码Check In,补丁提交,大量的代码审查消耗了大量的资源投入. 如何确保提交代码的质量和提 ...

  8. .Net Core技术研究-Span<T>和ValueTuple<T>

    性能是.Net Core一个非常关键的特性,今天我们重点研究一下ValueTuple<T>和Span<T>. 一.方法的多个返回值的实现,看ValueTuple<T> ...

  9. .NET Core技术研究-HttpContext访问的正确姿势

    将ASP.NET升级到ASP.NET Core之后,相信大家都会遇到HttpContext.Current无法使用的问题.这也是我们迁移ASP.NET Core必须解决的问题. 本文我们详细讨论一下, ...

随机推荐

  1. 从游戏到汽车 “明星IP”的发财轨迹

    "明星IP"的发财轨迹" title="从游戏到汽车 "明星IP"的发财轨迹"> 移动互联网时代的开启,不仅彻底重构了大众生 ...

  2. 一起了解 .Net Foundation 项目 No.8

    .Net 基金会中包含有很多优秀的项目,今天就和笔者一起了解一下其中的一些优秀作品吧. 中文介绍 中文介绍内容翻译自英文介绍,主要采用意译.如与原文存在出入,请以原文为准. IdentityModel ...

  3. qt creator源码全方面分析(3)

    目录 项目文件分析 qtcreator.pro 包含qtcreator.pri Qt版本判断 包含doc.pri 源码组织架构 指定dist文件列表 qbs配置 指定架构和平台 指定基础名 指定lin ...

  4. 基于 HTML5 Canvas 的 3D 热力云图效果

    前言 数据蕴藏价值,但数据的价值需要用 IT 技术去发现.探索,可视化可以帮助人更好的去分析数据,信息的质量很大程度上依赖于其呈现方式.在数据分析上,热力图无疑是一种很好的方式.在很多行业中都有着广泛 ...

  5. Java入门教程三(流程控制)

    概述 程序有 3 种结构:顺序结构.选择结构和循环结构.分别为:if elseswitch case,while与do while,for, foreach,return,break ,continu ...

  6. git指令-管理修改

    git指令-管理修改 git管理的不是文件,而是修改 eg:对readme.txt文件进行修改一行 在最后追加一句git has to tracked 然后添加,并且查看状态 cat +文件名称 表示 ...

  7. 关于HTTP那些事

    写这篇文章的原因 记录前端性能优化用到的关键概念 简化大家对HTTP的学习 大家或许面试的时候可以用得到哦 HTTP是什么 Web的应用层协议(超文本传输协议HyperText Transfer Pr ...

  8. 内存:你跑慢点行不行?CPU:跑慢点你养我吗?内存:我不管!(内附超全思维导图)

    主存(RAM) 是一件非常重要的资源,必须要认真对待内存.虽然目前大多数内存的增长速度要比 IBM 7094 要快的多,但是,程序大小的增长要比内存的增长还快很多.不管存储器有多大,程序大小的增长速度 ...

  9. 内网渗透之信息收集-windows系统篇

    windows 用户相关 query user #查看当前在线的用户 whoami #查看当前用户 net user #查看当前系统全部用户 net1 user #查看当前系统全部用户(高权限命令) ...

  10. java开发——Cloneable接口、clone()方法和深浅拷贝

    1.实现Cloneable接口表明该类的对象是允许克隆的. 2.允许克隆的意思是:可以调用clone()方法. 3.深拷贝还是浅拷贝,取决于如何重写Object的clone()方法. 4.原对象和克隆 ...