.NET Core技术研究-最实用最常用的配置读取方式

原文:.NET Core技术研究-最实用最常用的配置读取方式

升级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

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

?


1

2

3

4

5

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文件

?


1

2

3

4

5

6

7

8

9

10

{

  "Logging": {

    "LogLevel": {

      "Default": "Information",

      "Microsoft": "Warning",

      "Microsoft.Hosting.Lifetime": "Information"

    }

  },

  "AllowedHosts": "*"

}

通过代码读取配置

?


1

2

3

4

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类

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

[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配置示例代码:

?


1

2

Logging logConfig = new Logging();

<strong>Configuration.GetSection("Logging").Bind(logConfig);</strong>

?


1

<strong>var lifetime = Configuration["Logging:LogLevel:Microsoft.Hosting.Lifetime"];</strong>

?


1

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时指定的变量:

?


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

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读取配置之后。

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

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

?


1

2

set Key1="Value1"

set Logging__LogLevel__Customer=Information

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

?


1

2

3

4

5

6

7

8

9

10

11

public static IHostBuilder CreateHostBuilder(string[] args) =>

           Host.CreateDefaultBuilder(args)

           .ConfigureAppConfiguration((hostBuilder, config) =>

               {

                   config.AddEnvironmentVariables();

               })

               .ConfigureWebHostDefaults(webBuilder =>

               {

                   webBuilder.UseEnvironment("Development");

                   webBuilder.UseStartup<Startup>();                   

               });

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

?


1

2

3

4

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指令:

?


1

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读取配置:

?


1

2

var value = System.Configuration.ConfigurationManager.AppSettings["ConfigKey1"];

Console.WriteLine("ConfigKey1:" + value + "\n");

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

周国庆

2020/4/1

原文地址:https://www.cnblogs.com/lonelyxmas/p/12688643.html

时间: 2024-09-28 12:08:50

.NET Core技术研究-最实用最常用的配置读取方式的相关文章

ASP.NET Core技术研究-探秘依赖注入框架

原文:ASP.NET Core技术研究-探秘依赖注入框架 ASP.NET Core在底层内置了一个依赖注入框架,通过依赖注入的方式注册服务.提供服务.依赖注入不仅服务于ASP.NET Core自身,同时也是应用程序的服务提供者. 毫不夸张的说,ASP.NET Core通过依赖注入实现了各种服务对象的注册和创建,同时也实现了面向抽象的编程模式和编程体验,提升了应用程序的扩展性. 今天,我们普及一下ASP.NET Core中依赖注入的一些基本知识. 一.服务的注册 我们通过创建一个ASP.NET C

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

原文:ASP.NET Core技术研究-探秘Host主机启动过程 当我们将原有ASP.NET 应用程序升级迁移到ASP.NET Core之后,我们发现代码工程中多了两个类Program类和Startup类. 接下来我们详细探秘一下通用主机Host的启动过程. 一.Program类的Main函数入口 Program类最重要的功能就是启动主机,这里有一个主机的概念,是ASP.NET Core全新引入的. 主机负责应用程序启动和生存期管理. 同时,主机也是封装应用程序资源的对象: 依赖注入 (DI)

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

我们将原有ASP.NET应用升级到ASP.NET Core的过程中,会遇到一个新的概念:中间件. 中间件是ASP.NET Core全新引入的概念.中间件是一种装配到应用管道中以处理请求和响应的软件. 每个组件: 选择是否将请求传递到管道中的下一个组件. 可在管道中的下一个组件前后执行工作. 单独看以上中间件的定义,一个很直观的感觉:中间件是HTTP请求管道中的一层层的AOP扩展. 在展开介绍中间件之前,我们先回顾一下ASP.NET中HttpHandler和HttpModule的处理方式.  一.

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

将ASP.NET升级到ASP.NET Core之后,相信大家都会遇到HttpContext.Current无法使用的问题.这也是我们迁移ASP.NET Core必须解决的问题. 本文我们详细讨论一下,使用HttpContext的正确姿势. 先列一下使用HttpContext的具体场景: 1. 在Controller层访问HttpContext 2. 在中间件中使用HttpContext 3. 在数据访问层使用HttpContext 4. 在后台线程中访问HttpContext 5. 在Razor

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

将ASP.NET升级到ASP.NET Core之后,相信大家都会遇到HttpContext.Current无法使用的问题.这也是我们迁移ASP.NET Core必须解决的问题. 本文我们详细讨论一下,使用HttpContext的正确姿势. 先列一下使用HttpContext的具体场景: 1. 在Controller层访问HttpContext 2. 在中间件中使用HttpContext 3. 在数据访问层使用HttpContext 4. 在后台线程中访问HttpContext 5. 在Razor

.NetCore技术研究-一套代码同时支持.NET Framework和.NET Core

在.NET Core的迁移过程中,我们将原有的.NET Framework代码迁移到.NET Core.如果线上只有一个小型的应用还好,迁移升级完成后,只需要维护.NET Core这个版本的代码. 但是,如果是一个大型分布式应用,几百台Server,上千个.NET 应用进程.这种场景下,在一定的时期内,我们需要同时维护.NET Framework和.NET Core两套代码,同一个产品 特性,需要分别在两套代码中实现,这种代码同步的工作量是非常大的.因此,在这种场景下,有必要使用同一套代码既支持

&lt;脱机手写汉字识别若干关键技术研究&gt;

脱机手写汉字识别若干关键技术研究 对于大字符集识别问题,一般采用模板匹配的算法,主要是因为该算法比较简单,识别速度快.但直接的模板匹配算法往往无法满足实际应用中对识别精度的需求.为此任俊玲编著的<脱机手写汉字识别若干关键技术研究>在模板匹配算法的基础上,结合统计分析和统计信号处理的原理,对脱机手写汉字识别算法以及相关问题进行了研究,力求在基本不降低识别速度的基础上较大地提高识别的精度. 内容简介 书籍计算机书籍<脱机手写汉字识别若干关键技术研究>从脱机手写汉字识别为大类别数模式识别

数据去重2---高性能重复数据检测与删除技术研究一些零碎的知识

高性能重复数据检测与删除技术研究 这里介绍一些零碎的有关数据重删的东西,以前总结的,放上可以和大家交流交流. 1 数据量的爆炸增长对现有存储系统的容量.吞吐性能.可扩展性.可靠性.安全性. 可维护性和能耗管理等各个方面都带来新的挑战, 消除冗余信息优化存储空间效率成为 缓解存储容量瓶颈的重要手段,现有消除信息冗余的主要技术包括数据压缩[8]和数据去 重. 2 数据压缩是通过编码方法用更少的位( bit)表达原始数据的过程,根据编码 过程是否损失原始信息量,又可将数据压缩细分为无损压缩和有损压缩.

重复数据删除(De-duplication)技术研究(SourceForge上发布dedup util)

dedup util是一款开源的轻量级文件打包工具,它基于块级的重复数据删除技术,可以有效缩减数据容量,节省用户存储空间.目前已经在Sourceforge上创建项目,并且源码正在不断更新中.该工具生成的数据包内部数据部局(layout)如下: --------------------------------------------------| header | unique block data | file metadata |--------------------------------