如果你是刚接触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. kali 下的邮件发送工具 swaks

      kali 下的邮件发送工具 swaks Swaks 是一个功能强大,灵活,可编写脚本,面向事务的 SMTP 测试工具,目前 Swaks 托管在私有 svn 存储库中. 官方项目 http://jetm ...

    2. es6 快速入门 系列

      es6 快速入门(未完结,持续更新中...) 前言 为什么要学习es6 es6对于所有javaScript开发者来说,非常重要 未来,es6将构成javaScript应用程序的基础 es6中很多特性, ...

    3. 网络地址转换NAT的两种模式(概念浅析)& IP溯源

      由于全球IPv4地址越来越少.越来越贵,因此大到一个组织,小到一个家庭一个人都很难获得公网IP地址,所以只能使用内网地址,从而和别人共享一个公网IP地址.在这种情况下,NAT技术诞生. 翻译 NAT( ...

    4. java 方法详解

      什么是方法 方法的定义和调用 值传递与引用传递 值传递:指的是在方法调用时,传递的是参数是按值的拷贝传递. 特点:传递的是值的拷贝,也就是传递后就互不相关了. 引用传递:指的是在方法调用时,传递的参数 ...

    5. css实现鼠标滑过出现从中间向两边扩散的下划线

      这个效果一开始我是在华为商城页面上看到的,刚开始还以为挺复杂,实现的时候还有点没头绪.不过,还好有百度,借此记录一下我在导航条上应用的实现方法. 主要是借助了伪元素,代码如下: <div cla ...

    6. freebsd root 登录 KDE SDDM

      sddm.conf 文件现在默认不会自动生成了.需要自己创建:ee /usr/local/etc/sddm.conf写入MinimumUid=0MaximumUid=00就是root用户.然后更改/u ...

    7. PyCharm之python package和directory的区别

      python作为一门解释性的脚本语言.python中模块就是指一个py文件,如果我们将所有相关的代码都放在一个py文件中,则该py文件既是程序又是是模块,但是程序和模块的设计目的是不同的,程序的目的是 ...

    8. slickgrid ( nsunleo-slickgrid ) 4 解决区域选择和列选择冲突

      slickgrid ( nsunleo-slickgrid ) 3 解决区域选择和列选择冲突 之前启用区域选择的时候,又启用了列选择(CheckboxSelectColumn),此时发现选择状态与区域 ...

    9. 数据库Redis(一)

      Redis数据库的特点: Redis数据库属于nosql数据库的一种,其存储于内存中(非硬盘),修改较为方便. 而Redis数据库的存储方式是使用{key:value}方式存储,类似python基础中 ...

    10. apk签名、包名

      //通过各手机管理软件,如如360.豌豆荚等查看 //使用命令行,可以查看到permission.packagename.title.versionCode等 aapt dump badging ~/ ...