一. 各种文件的读取

1.说明

  在.Net Core中,各种配置文件的读取都需要依赖【Microsoft.Extensions.Configuration】程序集,当然在Asp.Net Core中已经内置了,然后通过依赖注入IConfiguration configuration对象进行配置文件的相关操作。

比如在控制器注入该对象:

相关约定:

①:配置键不区分大小写,例如,ConnectionString 和 connectionstring 被视为等效键。

②:在配置API中,冒号分隔符(:)适用于所有平台。

③:配置值是字符串

④:NULL值不能存储在配置中或绑定到对象。

 注:

  在Core MVC中,默认识别appsettings.json 文件,如果要添加其它类型的文件,需要通过AddJson、AddXml、AddIniFile、AddInMemoryCollection等方法手动添加进入, 方便起见通过 config.SetBasePath(Directory.GetCurrentDirectory());将当前目录设置为基础目录。

   这些AddXX方法,可以配置后面两个参数均为true,eg:config.AddJsonFile("Config/ypf1.json", optional: true, reloadOnChange: true);这样的话当配置文件发生变化的时候,会自动更新加载,而不必重启整个项目。

项目结构:手动新增的配置文件都在Config文件夹下(如下图),然后都在Program类中进行加载进来(代码如下)

  public class Program
{
public static readonly Dictionary<string, string> _dict = new Dictionary<string, string>
{
{"MKey1", "value1"},
{"MKey2", "value2"}
}; public static void Main(string[] args)
{
CreateWebHostBuilder(args).Build().Run();
} public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
//配置相关
.ConfigureAppConfiguration((hostingContext, config) =>
{
//1. 设置当前目录为基础目录(后面则可以用相对路径)
config.SetBasePath(Directory.GetCurrentDirectory());
//2. 加载json文件 (配置后面两个参数为true,当配置文件发生变化的时候,会自动更新加载,而不必重启整个项目)
config.AddJsonFile("Config/ypf1.json", optional: true, reloadOnChange: true);
//3. 加载xml文件
config.AddXmlFile("Config/ypf2.xml");
config.AddXmlFile("Config/ypf3.xml");
//4. 加载ini文件
config.AddIniFile("Config/ypf4.ini");
//5. 加载内存文件
config.AddInMemoryCollection(_dict);
})
.UseStartup<Startup>();
}

2. Json文件的读取

(1).读取规则:

A:普通对象直接通过键名来读取; B:对象中套对象通过多个键名(中间通过:连接)来读取;C: 数组对象则可以 键名:0(或1 或2)的方式来读取。

(2).实战演练:

① 项目默认的appsettings.json的读取,

 {
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
//下面自定义一些值,用于测试配置文件的读取
"MyFullName": "Maru Li",
"User": {
"userName": "ypf",
"userAge": 15,
"Child": {
"childName": "ydb",
"age": 12
}
},
"StudentList": [
{
"sName": "qdkjdx"
},
{
"sName": "bjdx"
}
],
//测试绑定类
"starship": {
"name": "USS Enterprise",
"registry": "NCC-1701",
"class": "Constitution",
"length": 304.8,
"commissioned": false
},
//测试绑定数组
"myArray": ["001","002","003"],
"json_array": {
"key": "valueA",
"subsection": [
"valueB",
"valueC",
"valueD"
]
} }
  {
var f0 = Configuration["MyFullName"];
var f1 = Configuration["User:userName"];
var f2 = Configuration["User:Child:childName"];
var f3 = Configuration["StudentList:0:sName"];
var f4 = Configuration["StudentList:1:sName"];
}

注:这里有一种特殊情况,比如数据库连接字符,通常是放在ConnectionStrings节点下的某个节点,所以可以通过 Configuration.GetConnectionString("xxx");来读取, 等价于:Configuration["ConnectionStrings:xxx"];

 {
"ConnectionStrings": {
"conn1": "sqlServer",
"conn2": "mySql"
}
}
 {
//数据库连接字符串读取
var c1 = Configuration["ConnectionStrings:conn1"];
var c2 = Configuration["ConnectionStrings:conn2"];
//等价于上面的
var c3 = Configuration.GetConnectionString("conn1");
var c4 = Configuration.GetConnectionString("conn2");
}

② 在Config文件夹中新增ypf1.json的读取:需要在Program类中通过代码 config.AddJsonFile("Config/ypf1.json"); 加载进来该json文件

 {
"FullName": "ypf"
}
 {
var f0 = Configuration["FullName"];
}

3. xml文件的读取

① 不存在重复节点,如:ypf2.xml 两个节点分别为section0 和 section1,可以明显的区分。

 <?xml version="1.0" encoding="UTF-8"?>
<configuration>
<section0>
<key0>value001</key0>
<key1>value002</key1>
</section0>
<section1>
<key0>value003</key0>
<key1>value004</key1>
</section1>
</configuration>
  {
var f0 = Configuration["section0:key0"];
var f1 = Configuration["section0:key1"];
var f2 = Configuration["section1:key0"];
var f3 = Configuration["section1:key1"];
}

② 存在重复节点,如:ypf3.xml,两个相同section节点,则需要通过name属性来区分,section下两个相同的key节点,也需要通过name来区分

 <?xml version="1.0" encoding="UTF-8"?>
<configuration>
<section name="section0">
<key name="key0">value101</key>
<key name="key1">value102</key>
</section>
<section name="section1">
<key name="key0">value103</key>
<key name="key1">value104</key>
</section>
</configuration>
 {
var f0 = Configuration["section:section0:key:key0"];
var f1 = Configuration["section:section0:key:key1"];
var f2 = Configuration["section:section1:key:key0"];
var f3 = Configuration["section:section1:key:key1"];
}

4. INI 配置文件的读取

结合[]类似特性的标记进行读取,如ypf4.ini。

 [section0]
key0=value201
key1=value202 [section1]
subsection:key=value203 [section2:subsection0]
key=value204 [section2:subsection1]
key=value205
 {
var f0 = Configuration["section0:key0"];
var f1 = Configuration["section0:key1"];
var f2 = Configuration["section1:subsection:key"];
var f3 = Configuration["section2:subsection0:key"];
var f4 = Configuration["section2:subsection1:key"];
}

5. 内存集合的读取

通过AddInMemoryCollection添加内存集合,如_dic。

   {
var f0 = Configuration["MKey1"];
var f1 = Configuration["MKey2"];
}

另外:还有环境变量、命令行的读取均不常用,这里不详细介绍了。

6. 单独封装帮助类

 首先要下载一系列程序集,如下图:

注:如果在控制台使用的话,需要将被读取的文件属性改为"始终复制"。

 分享封装代码:

     /// <summary>
/// 读取配置文件
/// </summary>
public static class ConfigHelp
{
/// <summary>
/// 读取Json类型的配置文件
/// </summary>
/// <param name="key">键名</param>
/// <param name="FilePath">文件路径,默认为:appsettings.json</param>
/// <returns></returns>
public static string GetString(string key, string FilePath = "appsettings.json")
{
var configurationBuilder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddJsonFile(FilePath, optional: true, reloadOnChange: true);
var configuration = configurationBuilder.Build();
return configuration[key];
}
/// <summary>
/// 读取Xml类型的配置文件
/// </summary>
/// <param name="key">键名</param>
/// <param name="FilePath">文件路径,默认为:myXml.json</param>
/// <returns></returns>
public static string GetXmlString(string key, string FilePath = "myXml.json")
{
var configurationBuilder = new ConfigurationBuilder().SetBasePath(Directory.GetCurrentDirectory()).AddXmlFile(FilePath, optional: true, reloadOnChange: true);
var configuration = configurationBuilder.Build();
return configuration[key];
} }

二. 方法和绑定

1. 常用方法

① GetValue<T>:从具有指定键的配置中提取一个值,并将其转换为指定类型。 如果未找到该键,则过载允许你提供默认值。

② GetSection:使用指定的子节键提取配置子节,永远不会返回 null。 如果找不到匹配的节,则返回空 IConfigurationSection。如果有值,则在后面通过.Value来获取。

③ GetChildren:获得 IEnumerable<IConfigurationSection>

④ Exits:判断配置节是否存在

 代码分享:

 {
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
//下面自定义一些值,用于测试配置文件的读取
"MyFullName": "Maru Li",
"User": {
"userName": "ypf",
"userAge": 15,
"Child": {
"childName": "ydb",
"age": 12
}
},
"StudentList": [
{
"sName": "qdkjdx"
},
{
"sName": "bjdx"
}
],
//测试绑定类
"starship": {
"name": "USS Enterprise",
"registry": "NCC-1701",
"class": "Constitution",
"length": 304.8,
"commissioned": false
},
//测试绑定数组
"myArray": ["001","002","003"],
"json_array": {
"key": "valueA",
"subsection": [
"valueB",
"valueC",
"valueD"
]
} }
   {
//这里使用默认的appsettings.json来进行测试
//1. GetValue
var f0 = Configuration.GetValue<string>("MyFullName");
//如果没有该键,则赋值noValue
var f1 = Configuration.GetValue<string>("MyFullName111", "noValue");
var f2 = Configuration.GetValue<string>("User:userName");
//2. GetSection
var section0 = Configuration.GetSection("User");
var section1 = Configuration.GetSection("User1");
var section2 = Configuration.GetSection("User:userName");
var section2Value = section2.Value;
//3. GetChildren
var child0 = section0.GetChildren();
//4. Exist
var isExist0 = Configuration.GetSection("User:userName").Exists();
var isExist1 = Configuration.GetSection("User:userName1").Exists();
}

2. 绑定

 借助Bind方法,可以直接读取配置文件中的内容然后赋值给类或对象,如果配置文件是xml文件,不再需要像传统的.Net 那样,解析或者序列化了,可以直接赋值。

这里还是用上面的appsetting.json这个文件进行测试。

再次重复appsetting.json代码

 {
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
//下面自定义一些值,用于测试配置文件的读取
"MyFullName": "Maru Li",
"User": {
"userName": "ypf",
"userAge": 15,
"Child": {
"childName": "ydb",
"age": 12
}
},
"StudentList": [
{
"sName": "qdkjdx"
},
{
"sName": "bjdx"
}
],
//测试绑定类
"starship": {
"name": "USS Enterprise",
"registry": "NCC-1701",
"class": "Constitution",
"length": 304.8,
"commissioned": false
},
//测试绑定数组
"myArray": ["001","002","003"],
"json_array": {
"key": "valueA",
"subsection": [
"valueB",
"valueC",
"valueD"
]
} }

类代码:

   public class Starship
{
public string Name { get; set; }
public string Registry { get; set; }
public string Class { get; set; }
public decimal Length { get; set; }
public bool Commissioned { get; set; }
}
public class User
{
public string userName { get; set; }
public int userAge { get; set; }
public Child child { get; set; }
} public class Child
{
public string childName { get; set; }
public int age { get; set; }
}
public class MyArrayExample
{
public string Key { get; set; }
public string[] Subsection { get; set; }
}

绑定代码:

  {
//1. 绑定到普通类
Starship startShipModel = new Starship();
Configuration.GetSection("starship").Bind(startShipModel); //2. 绑定到对象
User user = new User();
Configuration.GetSection("User").Bind(user); //3. 绑定数组到类
MyArrayExample myExample = new MyArrayExample();
Configuration.GetSection("json_array").Bind(myExample); }

三. 选项模式

1. 声明MyOptions类,与appsetting.json对应。

   public class MyOptions
{
public MyOptions()
{
Option1 = "value1_from_ctor";
}
public string Option1 { get; set; }
public string Option2 { get; set; } = "";
}
{
/******************************************************下面是选项模式相关的***************************************************/
"option1": "I am option1",
"option2": "I am option2"
}

2. 然后在Startup类中ConfigureServices中进行选项的相关配置,

3. 在HomeController中进行注入,然后使用即可。

        //下面是选项系统相关的属性或字段声明
private readonly MyOptions _options;
public HomeController(IOptions<MyOptions> optionsAccessor)
{
_options = optionsAccessor.Value;
}
public IActionResult Index2()
{
/*************************************** 三.各种配置文件的读取 **********************************************/ ViewBag.MyOptions= $"option1 = {_options.Option1}, option2 = {_options.Option2}";
return View();
}

页面展示:

!

  • 作       者 : Yaopengfei(姚鹏飞)
  • 博客地址 : http://www.cnblogs.com/yaopengfei/
  • 声     明1 : 本人才疏学浅,用郭德纲的话说“我是一个小学生”,如有错误,欢迎讨论,请勿谩骂^_^。
  • 声     明2 : 原创博客请在转载时保留原文链接或在文章开头加上本人博客地址,否则保留追究法律责任的权利。
 

第十节:Asp.Net Core 配置详解和选项模式的更多相关文章

  1. ASP.NET Core 中间件详解及项目实战

    前言 在上篇文章主要介绍了DotNetCore项目状况,本篇文章是我们在开发自己的项目中实际使用的,比较贴合实际应用,算是对中间件的一个深入使用了,不是简单的Hello World,如果你觉得本篇文章 ...

  2. [转]ASP.NET Core 中间件详解及项目实战

    本文转自:http://www.cnblogs.com/savorboard/p/5586229.html 前言 在上篇文章主要介绍了DotNetCore项目状况,本篇文章是我们在开发自己的项目中实际 ...

  3. 【转载】ASP.NET Core 中间件详解及项目实战

    前言 在上篇文章主要介绍了DotNetCore项目状况,本篇文章是我们在开发自己的项目中实际使用的,比较贴合实际应用,算是对中间件的一个深入使用了,不是简单的Hello World,如果你觉得本篇文章 ...

  4. ASP.NET Core管道详解[2]: HttpContext本质论

    ASP.NET Core请求处理管道由一个服务器和一组有序排列的中间件构成,所有中间件针对请求的处理都在通过HttpContext对象表示的上下文中进行.由于应用程序总是利用服务器来完成对请求的接收和 ...

  5. ASP.NET Core管道详解[6]: ASP.NET Core应用是如何启动的?[下篇]

    要承载一个ASP.NET Core应用,只需要将GenericWebHostService服务注册到承载系统中即可.但GenericWebHostService服务具有针对其他一系列服务的依赖,所以在 ...

  6. ASP.NET Core管道详解[3]: Pipeline = IServer + IHttpApplication

    ASP.NET Core的请求处理管道由一个服务器和一组中间件构成,但对于面向传输层的服务器来说,它其实没有中间件的概念.当服务器接收到请求之后,会将该请求分发给一个处理器进行处理,对服务器而言,这个 ...

  7. ASP.NET Core配置Kestrel 网址Urls

    ASP.NET Core中如何配置Kestrel Urls呢,大家可能都知道使用UseUrls() 方法来配置. 今天给介绍全面的ASP.NET Core 配置 Urls,使用多种方式配置Urls.让 ...

  8. ASP.NET Core 配置 EF 框架服务 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 配置 EF 框架服务 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 配置 EF 框架服务 上一章节中我们了解了 Entity ...

  9. ASP.NET Core 配置 EF SQLite 支持 - ASP.NET Core 基础教程 - 简单教程,简单编程

    原文:ASP.NET Core 配置 EF SQLite 支持 - ASP.NET Core 基础教程 - 简单教程,简单编程 ASP.NET Core 配置 EF SQLite 支持 上一章节我有提 ...

随机推荐

  1. 解决IIS Web部署 svg/woff/woff2字体找不到问题(vue部署后找不到)

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明.本文链接:https://blog.csdn.net/smartsmile2012/articl ...

  2. php 读取excel 时间列

    用PHP做一个导入excel功能,发现读取excel时间列的时候总是数据不对,去网上查找了这个函数,转换了一下就好了,真尼玛迷茫了,什么情况,先记录一下,以后再研究吧. 函数如下: function ...

  3. css实现图片信息展示

    <style> .layui-fluid{padding: 15px;} .img-responsive{display: block;width: 100%;max-width: 100 ...

  4. XSS相关有效载荷及绕道的备忘录(下)| 文末有打包好的负载

    前言: 今天发布的是下半部分 进入正题 过滤的绕过和一些奇异的有效载荷 大小写绕过 <sCrIpt>alert(1)</ScRipt> 绕过标签黑名单 <script x ...

  5. 关于less的一些入门用法

    less 变量(Variables) @nice-blue: #5B83AD; @light-blue: @nice-blue + #111; #header { color: @light-blue ...

  6. DDL(数据库定义语言)(五)

    一.数据定义语言(Data Definition Language)的基本操作 定义数据库.表等,包括CREATE语句.ALTER语句.DROP语句.CREATE语句用于创建数据库.数据表等,ALTE ...

  7. 清理Linux 磁盘空间

    1.执行   lsof | grep deleted发现有大量刚刚删除文件的进程存在,kill掉进程(或者重启进程)   OK 2.查看磁盘信息:df -lh 3.循环定位最大文件目录:du -h - ...

  8. 解决opencart设置SSL后评论不能翻页的问题

    为了网站的安全和seo,我们为客户的opencart网站添加了SSL加密实现https,并设置了301跳转使http跳到https,基本所有的功能都完好,就是有一点评论分页无法加载分页,去分析了链接源 ...

  9. hbase运行原理

    HBase特点 1)海量存储 Hbase适合存储PB级别的海量数据,在PB级别的数据以及采用廉价PC存储的情况下,能在几十到百毫秒内返回数据.这与Hbase的极易扩展性息息相关.正式因为Hbase良好 ...

  10. HTML基础四-VUE

    一.VUE VUE官网:https://cn.vuejs.org/v2/guide/ 1.1 Vue简介 VUE与JS的区别 VUE在JS的基础上进行了优化 增加VUE最强大的特点,对数据操作特别的友 ...