在.Net Core应用中,配置系统提供了灵活的配置加载与更新机制,默认支持从JSON文件、环境变量、命令行参数等多种来源读取配置,同时内置了配置变更监听能力,可实现配置修改后无需重启应用自动生效的效果。
.Net Core基础配置加载
.Net Core的配置系统核心接口是IConfiguration,应用启动时默认会加载appsettings.json文件中的配置内容,开发者也可以通过代码添加其他配置源。
首先创建一个基础的.Net Core控制台应用,默认的项目模板已经包含了基础配置加载逻辑,我们也可以手动编写配置加载代码:
using Microsoft.Extensions.Configuration;
using System;
namespace ConfigDemo
{
class Program
{
static void Main(string[] args)
{
// 构建配置对象,加载appsettings.json文件
IConfiguration configuration = new ConfigurationBuilder()
.SetBasePath(AppContext.BaseDirectory)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.Build();
// 读取配置项
string appName = configuration["AppName"];
string logLevel = configuration["Logging:LogLevel:Default"];
Console.WriteLine($"应用名称:{appName}");
Console.WriteLine($"默认日志级别:{logLevel}");
}
}
}
上述代码中AddJsonFile方法的reloadOnChange参数设置为true,表示当appsettings.json文件发生变更时,配置系统会自动重新加载文件内容,这是实现配置自动更新的基础前提。
使用IOptionsSnapshot实现配置自动更新
在.Net Core的依赖注入体系中,推荐使用IOptions系列接口来读取配置,其中IOptionsSnapshot接口支持配置的自动更新,它会在每次请求时重新读取最新的配置内容。
首先定义一个配置实体类,用于映射配置文件中的内容:
using System;
namespace ConfigDemo
{
// 配置实体类,对应appsettings.json中的AppSettings节点
public class AppSettings
{
public string AppName { get; set; }
public int MaxRequestCount { get; set; }
public string AllowedHosts { get; set; }
}
}
然后在appsettings.json中添加对应的配置节点:
{
"AppSettings": {
"AppName": "配置测试应用",
"MaxRequestCount": 100,
"AllowedHosts": "*"
},
"Logging": {
"LogLevel": {
"Default": "Information",
"Microsoft.AspNetCore": "Warning"
}
}
}
接下来在应用启动时为配置实体类绑定配置,并注册到依赖注入容器:
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using System;
namespace ConfigDemo
{
class Program
{
static void Main(string[] args)
{
IServiceCollection services = new ServiceCollection();
// 构建配置
IConfiguration configuration = new ConfigurationBuilder()
.SetBasePath(AppContext.BaseDirectory)
.AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
.Build();
// 注册配置到容器,绑定AppSettings节点到AppSettings类
services.Configure<AppSettings>(configuration.GetSection("AppSettings"));
// 注册测试服务
services.AddTransient<TestService>();
IServiceProvider serviceProvider = services.BuildServiceProvider();
TestService testService = serviceProvider.GetRequiredService<TestService>();
testService.PrintConfig();
// 模拟等待配置修改,等待10秒后再次读取配置
Console.WriteLine("请修改appsettings.json中的AppSettings节点内容,等待3秒后查看更新结果");
System.Threading.Thread.Sleep(3000);
testService = serviceProvider.GetRequiredService<TestService>();
testService.PrintConfig();
}
}
}
测试服务的实现代码如下,通过构造函数注入IOptionsSnapshot<AppSettings>来读取配置:
using Microsoft.Extensions.Options;
using System;
namespace ConfigDemo
{
public class TestService
{
private readonly AppSettings _appSettings;
// 注入IOptionsSnapshot接口,支持配置自动更新
public TestService(IOptionsSnapshot<AppSettings> options)
{
_appSettings = options.Value;
}
public void PrintConfig()
{
Console.WriteLine($"当前配置:AppName={_appSettings.AppName},MaxRequestCount={_appSettings.MaxRequestCount}");
}
}
}
运行程序后,修改appsettings.json中AppSettings节点的AppName或MaxRequestCount值并保存,等待3秒后程序会输出更新后的配置内容,无需重启应用。
不同配置更新接口的区别
.Net Core提供了三个常用的配置选项接口,它们的特性和适用场景有所不同,具体区别如下:
| 接口名称 | 是否支持自动更新 | 生命周期 | 适用场景 |
|---|---|---|---|
IOptions<TOptions> | 否 | 单例 | 配置不会变更的场景,性能最优 |
IOptionsSnapshot<TOptions> | 是 | 作用域 | 请求级别配置读取,每次请求获取最新配置 |
IOptionsMonitor<TOptions> | 是 | 单例 | 需要实时监听配置变更,可注册变更回调的场景 |
使用IOptionsMonitor监听配置变更
如果需要在配置发生变更时立即执行自定义逻辑,可以使用IOptionsMonitor接口,它提供了OnChange方法用于注册配置变更回调。
修改测试服务代码如下:
using Microsoft.Extensions.Options;
using System;
namespace ConfigDemo
{
public class TestService
{
private AppSettings _appSettings;
// 注入IOptionsMonitor接口
public TestService(IOptionsMonitor<AppSettings> options)
{
_appSettings = options.CurrentValue;
// 注册配置变更回调
options.OnChange(newConfig =>
{
_appSettings = newConfig;
Console.WriteLine($"配置发生变更,最新AppName:{newConfig.AppName}");
});
}
public void PrintConfig()
{
Console.WriteLine($"当前配置:AppName={_appSettings.AppName},MaxRequestCount={_appSettings.MaxRequestCount}");
}
}
}
此时修改配置文件并保存,程序会立即触发OnChange回调,输出配置变更的信息,不需要等待下一次请求或方法调用。
注意事项
- 使用
reloadOnChange: true加载JSON配置文件时,需要确保文件有读写权限,且文件格式正确,否则会导致配置加载失败。 IOptionsSnapshot的生命周期是作用域级别,在单例服务中注入IOptionsSnapshot会导致运行时错误,单例服务中需要使用IOptionsMonitor。- 如果配置来源是环境变量或命令行参数,这些配置源默认不支持变更监听,无法实现自动更新,只有文件类型的配置源支持
reloadOnChange特性。
配置自动更新功能仅适用于应用运行时可以动态调整的配置项,对于数据库连接字符串等核心配置,修改后可能需要配合其他逻辑才能完全生效,需要根据实际业务场景做适配。
.Net_Core配置IConfigurationIOptionsSnapshot自动更新修改时间:2026-07-01 16:07:19