如果你是刚接触ASP.NET Core的学习的话,你会注意到:在ASP.NET Core项目中,看不到.NET Fraemwork时代中的web.config文件和app.config文件了。那么你肯定好奇,现在在ASP.NET Core应用程序中,是通过什么来配置我们的配置信息呢? 下面就跟着我一起来学习了解吧,在ASP.NET Core中是如何配置我们的配置信息,如果读取配置信息的。

在ASP.NET Core 中是使用一个或者多个配置提供程序来配置我们的应用程序的。配置提供程序可以从各种不同的配置源中,读取我们配置的信息,这些配置源有下面这些:

  • 一种是配置文件,例如JSON、XML、INI文件等
  • 环境变量
  • Azure Key Vault
  • Azure App Configuration
  • 命令行参数(Command-line arguments)
  • 自定义的配置提供程序,安装或创建(Custom providers,Installed or created)
  • 目录文件 (Directory Files)
  • 内存中的.NET对象(In-Menory .NET objects)
  • 在这篇文章中,我将带领大家学习,如何通过JSON、INI、XML文件来配置、读取我们的配置信息,同样在这里面我还会教大家一种通用的方式,读取配置信息,它就是:使用自定义类来读取配置信息,这种方式叫做选项模式读取配置信息。

    首先我们来看看ASP.NET Core中的默认的配置吧,我们新建一个空白的ASP.NET Core应用程序,名字这里我取:MyConfiguration,框架选择当前最新的.net 5.0.

    可以看到默认生成了5个文件和一个文件夹properties,分别是:appsettings.json、appsettings.Development.json、Program.cs、Startup.cs,还有一个名字为Properties的文件夹,里面有一个launchSettings.json文件。

    我们来先看一看,Program.cs文件:

    Program.cs文件中有两个方法,一个是我们熟悉的Main函数,一个是CreateHostBuilder函数。CreateHostBuilder函数为我们创建了主机。然后在Main函数中调用这个CreateHostBuilder方法,也就是程序启动就会创建主机。

    CreateHostBuilder为我们的应用程序提供了默认的配置,这些默认的配置的顺序如下:

  • ChainedConfigurationProvider : 链式配置提供程序,它将现有的IConfiguration作为源。在默认情况下,如果没有任何主机配置以及设置的时候,这个就是第一个配置提供程序。
  • appsettings.json :它使用JSON 配置提供程序。
  • appsettings.Envirent.json   它也是使用JSOn配置提供程序的。例如,生产环境就是这个文件appsettings.Production.json,开发环境下,对应的就是:appsettings.Development.json文件。
  • App secrets 当应用程序的运行环境是Development的时候。
  • 环境变量(Environment variables)使用的是环境变量配置提供程序(Environment Variables configuration provider
  • 命令行参数(Command-line arguments)使用的是命令行配置提供程序(Command-line configuration provider)
  • 需要牢牢记在脑海中的是:在上面6个配置提供程序中,后出来的配置,会重写之前的配置。例如:如果我们在appsetting.json以及appsetting.Environment.json文件中,为同一个配置,都设置了值,那么appsetting.Environment.json文件中,设置的这个值将会被使用。使用默认的配置提供程序的顺序,那么命令行配置提供程序将会重写所有在它之前的配置提供程序的配置。

    想要连接更多关于CreateHostBuilder方法为我们做了什么,可以看这个微软官方文档:Default builder settings

    这篇文章,我的重心就是带领大家学习如果通过文件配置提供程序来配置、读取我们的配置信息,也就是如何从JSON、INI、XML文件中读取配置信息。

    从Json文件中读取配置信息

    打开appsettings.json文件,添加如下配置信息:

    同样在appsetting.Development.json文件中,加上类似的

    现在我们要做的就是来读取这些配置信息。

    首先空白的模板是没有控制器等文件夹的,我们要做的就是自己一步一步搭建好。

    创建好一个Controllers文件夹,在里面新建一个空白的HomeController控制器。在Home控制器中写上如下代码:

    Index视图代码:

    然后打开Startup.cs文件,需要修改两处:

    然后运行程序:

    可以看到读取的配置信息是appsetting.Development.json文件中的。这是因为我们应用程序默认的环境就是设置的Development。

    默认的JsonConfigurationProvider ,首先是从appsetting.json文件中读取配置,然后appsettings.Environment.json文件中的配置就会加载,然后就会重写了appsettings.json文件中的配置了。

  • 在开发环境中(Development),appsettings.Development.json文件,重写appsettings.json文件中的配置;
  • 在生产环境中(Production),appsettings.Production.json文件,重写appsettings。json文件中的配置。
  • 如果我们把ASPNETCORE_ENVIRONMENT改成【Production】,再运行程序,就会发现:读取的是appsetting.json文件中的配置信息了,因为在这里,我们没有appsettings.Production.json文件。所以就会去读取appsettings.json文件。

    这种方式,我们在程序运行的时候,修改appetttings.json文件,按回车键,会自动获取最新的配置。例如我们在运行的时候,修改一下appsettings.json文件:

    可以看到最新的【不用重新运行,直接刷新网页就能获取最新的配置信息】:

    使用选项模式读取应用程序的配置

    如果你打算构建大型的应用程序,势必就会有很多的配置信息。或者当你有很多层级的配置信息需要去读取,像上面例子那样,通过Configuration和冒号一个一个的读取方式是不可取的。并且还有机会,因为错误的拼写,导致你读取配置的时候发生异常。推荐读取配置的方式就是使用选项模式。

    选项模式使用类,来提供对配置信息进行强类型的读取。废话不多说,我们开干!

    新建一个Common文件夹,新建一个类叫做ApplicationOptions,写上这些代码:

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Threading.Tasks;

    namespace MyConfiguration.Common

    {
         public class ApplicationOptions
         {
             /// <summary>
             /// 配置中的MyApplication键值
             /// </summary>
             public const string MyApplication = "MyApplication";

    /// <summary>
             /// 配置文件中的Name
             /// </summary>
             public string Name { get; set; }

    /// <summary>
             /// 配置文件中的Version
             /// </summary>
             public string Version { get; set; }

    public string DefaultUrl { get; set; }

    /// <summary>
             /// 配置中的Support子节点
             /// </summary>
             public SupportOption Support { get; set; }
         }

    /// <summary>
         /// SupportOption
         /// </summary>
         public class SupportOption
         {
             public const string Support = "Support";
             /// <summary>
             /// 配置中的Email
             /// </summary>
             public string Email { get; set; }

    /// <summary>
             /// 配置中的Phone
             /// </summary>
             public string Phone { get; set; }

    }

    }

    我们需要时刻铭记的是:当我们使用选项模式的时候,我们需要创建一个类,定义一些字段和属性来读取配置文件中的信息:

  • 这个类不能是抽象类,并且这个类需要有一个无参数的构造函数
  • 配置文件中,所有可以读写的属性,在这个类中,必须要都绑定好(也就是要够申明成可以读写的属性)
  • 字段不能绑定。例如这个例子中的MyApplicationSupport常量,就没有绑定。
  • 为了绑定我们的配置,我们需要调用ConfigurationBinder.Bind方法,具体做法如下:

    然后我们运行程序:

    我们直接修改一下appsettings.json文件:

    然后刷新页面:

           可以看到不用停止程序,直接修改json配置文件,便直接可以读取最新修改的配置信息。

    另外上面的代码,我们是通过:IConfiguration.Bind方法绑定的,还可以使用Get方法绑定。

    我们可以这样:上面两句代码,可以用下面这一行代替。运行的结果也是一样的。

    修改一下appsettings.json文件:

    然后刷新一下页面,也获取到了最新修改后的配置信息:

    使用依赖注入,注入我们的ApplicationOptions类

    在上面所有的例子中,我都是直接在一个标准的控制器中读取我们的配置信息,如果你有一个大型的应用程序,需要在不同的控制器中读取配置信息,我们该怎么做呢?难道在每一个控制器中都写重复的读取配置的代码么?推荐的方式是在Stratup.cs文件中的ConfigureServices方法中,使用依赖注入的方式,注入我们的选项模式的自定义类。请看下面的代码:

    运行程序:

    修改一下配置文件:刷新页面,发现还是没有变化,没有获取最新的1.3版本和最新的Email信息。

    除非重新关闭程序,重新运行程序:才能获取最新的配置信息,所以这种依赖注入的方式,就这点毛病,需要重启一下程序。

    使用XML配置提供程序

    我们有这样的一个XML文件:

    Program类:我们做如下修改

    控制器类:

    运行程序:读取到了XML中的配置信息。

    修改一下XML文件

    刷新页面获取到了最新的XML配置:

    使用INI配置提供程序

    INI文件如下:

    Program类中代码:

    控制器中代码:

    运行程序:读取到了INI文件中的配置信息了。

    好了,以上就是ASP.NET Core中如何读取配置信息的内容,后面两种XML和INI读取配置的方式,因为篇幅的原因,就只是粘贴了核心代码,相信大家也能看得懂。希望我的这篇文章能够帮到你 ,如果觉得我写的不错,可以点个赞,帮忙分享,转载,请注明原文链接,谢谢合作。我是灰太狼的梦想,一个自强不息,脚踏实地的程序猿。

    3、带你一步一步学习ASP.NET Core中的配置之Configuration的更多相关文章

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

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

    2. 学习ASP.NET Core Razor 编程系列十三——文件上传功能(一)

      学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

    3. 学习ASP.NET Core Razor 编程系列四——Asp.Net Core Razor列表模板页面

      学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

    4. 学习ASP.NET Core Razor 编程系列六——数据库初始化

      学习ASP.NET Core Razor 编程系列目录 学习ASP.NET Core Razor 编程系列一 学习ASP.NET Core Razor 编程系列二——添加一个实体 学习ASP.NET ...

    5. C#中的函数式编程:递归与纯函数(二) 学习ASP.NET Core Razor 编程系列四——Asp.Net Core Razor列表模板页面

      C#中的函数式编程:递归与纯函数(二)   在序言中,我们提到函数式编程的两大特征:无副作用.函数是第一公民.现在,我们先来深入第一个特征:无副作用. 无副作用是通过引用透明(Referential ...

    6. 学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(上)

      学习ASP.NET Core Blazor编程系列一--综述 一.概述 Blazor 是一个生成交互式客户端 Web UI 的框架: 使用 C# 代替 JavaScript 来创建信息丰富的交互式 U ...

    7. 学习ASP.NET Core Blazor编程系列二——第一个Blazor应用程序(完)

      学习ASP.NET Core Blazor编程系列一--综述 学习ASP.NET Core Blazor编程系列二--第一个Blazor应用程序(上) 学习ASP.NET Core Blazor编程系 ...

    8. 从明面上学习ASP.NET Core

      一.前言     这篇文章就是从能看到地方去学习Core,没有很深奥,也没有很难懂,现在我们开始吧. 二.构建项目,引发思考     创建项目的步骤真的很简单,你要是不会,我真也没法了,我这是创建的M ...

    9. C# 嵌入dll 动软代码生成器基础使用 系统缓存全解析 .NET开发中的事务处理大比拼 C#之数据类型学习 【基于EF Core的Code First模式的DotNetCore快速开发框架】完成对DB First代码生成的支持 基于EF Core的Code First模式的DotNetCore快速开发框架 【懒人有道】在asp.net core中实现程序集注入

      C# 嵌入dll   在很多时候我们在生成C#exe文件时,如果在工程里调用了dll文件时,那么如果不加以处理的话在生成的exe文件运行时需要连同这个dll一起转移,相比于一个单独干净的exe,这种形 ...

    随机推荐

    1. JUnit5学习之六:参数化测试(Parameterized Tests)基础

      欢迎访问我的GitHub https://github.com/zq2599/blog_demos 内容:所有原创文章分类汇总及配套源码,涉及Java.Docker.Kubernetes.DevOPS ...

    2. MySQL注入与informantion_schema库

      目录 只可读 自动开启 和MySQL注入有关的3个表 手动注入的使用案例 表介绍 查询一个表中全部字段的过程 MySQL V5.0安装完成会默认会生成一个库(informantion_schema), ...

    3. Node更丝滑的打开方式

      Node更丝滑的打开方式 1. 使用背景 最近前端的一个项目,使用gulp作为工程化.在运行过程中出现如下错误 gulp[3192]: src\node_contextify.cc:628: Asse ...

    4. JavaScript中的事件循环机制跟函数柯里化

      一.事件循环机制的理解 test();//按秒输出5个5 function test() { for (var i = 0; i < 5; i++) { setTimeout(() => ...

    5. Google单元测试框架gtest之官方sample笔记4--事件监控之内存泄漏测试

      sample 10 使用event listener监控Water类的创建和销毁.在Water类中,有一个静态变量allocated,创建一次值加一,销毁一次值减一.为了实现这个功能,重载了new和d ...

    6. SpringMVC-01 什么是SpringMVC

      SpringMVC-01 什么是SpringMVC 回顾MVC 1.什么是MVC MVC是模型(Model).视图(View).控制器(Controller)的简写,是一种软件设计规范. 是将业务逻辑 ...

    7. C#扩展方法的一分钟小例子

      扩展方法是静态方法,是类的一部分,但没有在类的源代码中,就像一个补丁 首先创建一个静态类,然后创建一个静态方法,重点是静态方法的参数 public static class xExtension { ...

    8. 漏洞复现-CVE-2017-12629-RCE-solr:XXE

                    0x00 实验环境 攻击机:Win 10.Win Server 2012 R2 靶机:Ubuntu18 (docker搭建的vulhub靶场) 0x01 影响版本 Apac ...

    9. 关于redis缓存数据库的一些思考

      今晚无聊,躺在床上,在刷技术文章时,看见了一篇关于redis缓存的文章 写的蛮好,这也就引起了我对于redis思考! 不如往深了说 引起了我对于追求探索技术本质的一些思考 平时在网上刷到很多关于red ...

    10. slickgrid ( nsunleo-slickgrid ) 1 开篇有益

      slickgrid (nsunleo-slickgrid)  1 开篇有益  作为专职的程序猿,自认为是老菜鸟或老民工,以前一直在某浪上写博客,上知天文,下达地理.做了N年的.net,又转Java,从 ...