ASP.NET Core 学习(3)
ASP.NET Core、c#、配置文件
正文内容
配置的基本结构
ASP.NET Core 应用程序的配置数据为字典结构——以键值对的方式读写。一下接口将用于访问配置数据:
- IConfigurationRoot:表示配置数据中的根节点
- IConfigurationSection:表示配置中的小节
- IConfiguration:表示配置数据的最原始接口
1、在.NET应用程序中使用配置
在非ASP.NET Core应用程序中使用配置文件,需要手动添加一下Nuget包引用:
Microsoft.Extensions.Configuration
Microsoft.Extensions.Configuration.Json
新建一份test.json文件:
{
“AppIcon”: ”app.ico”,
“paths”:{
“mainPath”: “/bin/appx.exe”,
“tmpPath”: “/tmp”
}
}
如何读取:
using Microsoft.Extensions.Configuration;
using System.Text;
//创建ConfigurationBuilder实例
IConfigurationBuilder configBuilder = new ConfigurationBuilder();
//将test.json作为配置数据来源
//可添加多个文件,在生成配置时会将来自于多个文件的数据合并
configBuilder.AddJsonFile(“test.json”);
//调用Build()方法来生成IConfiguration类型的对象
IConfiguration config = configBuilder.Build();
//……
//读取时
string appicon = config[“appIcon”];
string mainpath = config[“paths:mainPath”];
2、在ASP.NET Core应用程序中使用配置文件
ASP.NET Core项目默认已经引用与配置相关的包,开发者无需手动配置。
2.1 配置的数据来源
- 命令行:在运行应用程序时通过命令行参数传递配置
- 环境变量:不管是系统级别的环境变量,还是用户级别的环境变量都可以
- Json文件:从Json文档中加载配置
- ini文件:从ini文件(初始化文件)中加载配置
- 内存:直接在代码中设置
- XML:从XML文档中加载配置
不论来自于哪个渠道,在生成IConfiguration相关对象时会将各个数据源合并,形成一棵完整的配置树。如果相同的配置键名出现在了不同的数据源,那么后添加的数据会替换前面的数据。
以JSON配置文件为例:
//创建应用构建器
var builder = WebApplication.CreateBuilder(args);
//添加配置源(Json流对象)
builder.Configuration.AddJsonStream(流对象);
//添加配置源(Json文件)
builder.Configuration.AddJsonFile(文件);
//构建应用程序
var app = builder.Build();
//...
//读取配置信息
IConfigurationRoot config = (IConfigurationRoot)app.Configuration;
//读取根节点下的配置项
string Val1 = config["item1"];
string Val2 = config["item2"];
//获取小节
IConfigurationSection section = config.GetSection("sect");
//读取sect节点下的配置项
string Val3 = section["enble"];
string Val3 = section["lc"];
2.2 查看所有配置信息
IConfigurationRoot接口派生自IConfiguration接口,既可以读取配置节点信息,也可以直接获取配置项的值。可通过GetDebugView()扩展方法获得当前应用程序中已加载的所有配置信息,以字符串的形式返回。
IConfigurationRoot cfg = (IConfigurationRoot)app.Services.GetRequiredService<IConfiguration>();
string s = cfg.GetDebugView();
2.3 配置文件相关接口与类
- IConfigurationBulider接口:一个用于构建应用程序配置的对象,默认实现类为
ConfigurationBulider,Sources属性表示配置的数据源列表。调用Add()方法添加配置数据源。调用Build()方法将所有配置数据源合并。 - ConfigurationManager类:此类同时实现了
IConfigurationBulider和IConfigurationRoot接口,因此它兼具ConfigurationBulider类和ConfigurationRoot类的功能。 - IConfigurationSource接口:表示配置的数据来源,实现该接口的类型必须实现
Build()方法,该方法返回一个实现IConfigurationProvider接口的实例类型。 - IConfigurationProvider接口:支持应用程序对配置信息的基础访问操作。如
//返回指定父节点的直接子集 GetChildKeys(); //根据参数传入的键名,返回与之对应的配置项的值 TryGet(); //设置指定配置项的值 Set(); //返回一个实现了IChangeToken接口的对象实例 //用于跟踪配置信息的更新 GetReloadToken(); //从配置源中加载配置信息 Load();
3、JSON配置
3.1 访问指定配置项
string Val = config["item"];
3.1 访问JSON数组对象
JSON文档中的配置可能会出现数组类型,如:
{
"demo":[
{
"width": 505,
"height": 370
},
{
"width": 1215,
"height": 860
}
]
}
这种情况下,可以通过索引访问需要的元素,如:
//读取第一组配置
string w1 = config["demo:0:width"];
string h1 = config["demo:0:height"];
//读取第二组配置
string w2 = config["demo:1:width"];
string h2 = config["demo:1:height"];
3.2 自动重新加载配置
AddJsonFile()方法有以下重载:
public static IConfigurationBulider AddJsonFile(this IConfigurationBulider builder, IFileProvider provider, string path, bool optional, bool reloadOnChange)
public static IConfigurationBulider AddJsonFile(this IConfigurationBulider builder, string path, bool optional, bool reloadOnChange)
以上重载都包含两个bool类型的参数
- optional:指定此JSON文件是否为可选,如果此参数为true,当文件不存在时应用程序不会抛出异常。如果为false,当文件不存在时则会抛出
FileNotFoundException异常。 - reloadOnChange:当文件被修改后,是否重新加载配置信息。
ASP.NET Core应用程序默认添加的appsettings.json和appsettings.{EnvironmentName}.json都是可选且自动重新加载的
4、XML配置
与JSON配置相似,基于XML文档的配置既可以来自于文件(使用AddXmlFile()添加),也可以来自于流对象(使用AddXmlStream()添加)。
ASP.NET Core应用程序将按照以下规则从XML文档中加载配置:
- 根元素会被忽略:以下配置路径为:
menu:items:open<root> <menu> <items> <open>打开文件</open> </items> </menu> </root> - 按照XML文档的层次以及元素出现的顺序构造路径,元素的内容将被解析为配置项的值
<root> <headers> <len>120</len> <type>png</type> </headers> <blocks> <tag>v4</tag> <layer>3</layer> </blocks> </root> //以上将解析出4个配置项 headers:len = 120 headers:type= png blocks:tag= v4 blocks:layer = 3 - 如果某个XML元素含有特性列表,那么每个特性也被解析成一个配置项。其中,特性名称为配置项的键名,特性值为配置项的值。
<data> <dir>/user/opt</dir> <center x="176" y="308"/> <line> <start x="45" y="15"/> <end x="195" y="416"/> </line> <tools vset="1.0"> <item label="copy"/> <item label="cut"/> <item label="save"/> </tools> </data> //以上XML可解析出以下配置 dir = /user/opt center:x = 176 center:y = 308 line:start:x = 45 line:start:x = 15 line:end:x = 195 line:end:y = 416 tools:vset = 1.0 tools:item:0:label = copy tools:item:1:label = cut tools:item:2:label = save - 如果某个元素上存在名为
name的特性,就会使用此特性的值充当配置项的键名<config> <content> <media name="DVD" isrc="CN-D07-09-236-00/V.K">家园</media> </content> </config> //解析为 content:media:DVD = 家园
5、环境变量配置
环境变量提供的是环境参数,因此必须在应用程序运行之前设置环境变量。ASP.NET Core应用程序已添加来自环境变量的配置,开发者无需手动添加。
待补充
6、命令行参数
ASP.NET Core应用程序已添加命令行参数配置源,在调用var builder = WebApplication.CreateBuilder(args)时需要同时传递应用程序的命令行参数。
待补充
7、ini配置
待补充
8、配置与依赖注入
public class DemoController : Controller
{
IConfiguration _config;
//通过依赖注入提取配置信息时要使用IConfiguration来接收
//传入的实际为ConfigurationManager对象
public DemoController(IConfiguration cfg)
{
//拿到对象
_config = cfg;
}
public IActionResult GetConfig()
{
//读取配置项内容
string apiBody = _config["api-body"];
return Content(apiBody);
}
}
正文内容已启用复制保护,代码块与行内代码仍支持复制。
评论区
0 条已展示评论发表评论
提交后将进入人工审核,审核通过后才会展示。
读者留言
以下仅展示已通过审核的评论内容。