文章详情 后端开发

ASP.NET Core 学习(3)

发布时间:2026-04-29 20:57 浏览次数:17 最后更新:2026-04-30 13:21

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接口:一个用于构建应用程序配置的对象,默认实现类为ConfigurationBuliderSources属性表示配置的数据源列表。调用Add()方法添加配置数据源。调用Build()方法将所有配置数据源合并。
  • ConfigurationManager类:此类同时实现了IConfigurationBuliderIConfigurationRoot接口,因此它兼具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.jsonappsettings.{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 条已展示评论
发表评论

发表评论

提交后将进入人工审核,审核通过后才会展示。

邮箱仅用于必要的联系与基础风控,不会在页面中公开展示。

请文明发言,避免发布广告、链接或敏感内容;短时间内频繁提交会被限制。

隐私提示:提交评论即表示你同意站点为评论展示、审核、防刷与安全风控目的处理你填写的昵称、邮箱和评论内容。

其中邮箱不会公开展示,也不会用于与评论无关的公开用途。

已展示评论

读者留言

以下仅展示已通过审核的评论内容。

0 条评论
当前还没有通过审核的评论,后续可在后台审核后展示。