通常在程序发布后,配置文件的修改有时候也避免不了,如果能检测到文件的改动,这样不用重启.NET应用,让用户感觉不到改变,从而提高用户体验度。例如修改配置文件里的默认发件邮箱地址,当修改后我们不用重启站点。ChangeToken.OnChange就能检测配置文件或者其它文件的变化。下面我们来演示一下.
实例
需求是模拟在程序发布后,修改配置文件中的邮箱地址,修改后能检测到文件的修改,并重新读取到内存,代码如下:
首先建一个客户邮箱的实体类,用来映射文件的邮箱
//实体类
public class Customer
{
public string email{ get; set; }
}
然后创建配置文件appsettings1.json,内容如下:
{
"id": 1,
"name": "zangshans",
"email": "test@test.com",
"age": 11
}
读取文件和使用ChangeToken.OnChang
//首先实例化一个ConfigurationBuilder便于读取文件
var configuration = new ConfigurationBuilder()
//Add()跟下面的AddJsonFile等同,下面的AddJsonFile也是封装了.Add(
// .Add(new JsonConfigurationSource { Path= "appsettings1.json" })
//加载配置文件 optional 文件是否可选。reloadOnChange//如果文件发生更改,是否应重载配置。
.AddJsonFile("appsettings1.json", optional: true, reloadOnChange: true)
.Build();
//使用ChangeToken.OnChange
ChangeToken.OnChange(
() => configuration.GetReloadToken(),
() =>
{
Console.Clear();
//绑定到实体
var rel = configuration.Get<Customer>();
Console.WriteLine($"用户邮箱:{rel.email}");//打印到控制台
}
);
var rel = configuration.Get<Customer>(); //绑定到实体
Console.WriteLine($"用户邮箱:{rel.email}");
Console.Read();
接下来我们看看效果:
修改前的邮箱
修改邮箱地址保存
修改后的邮箱,不用重启,自动变更为新的地址
这就实现了配置文件热更新的读取,此方法支持.NET 3.1以上版本,大家可以尝试一试。
遇到的坑:
在控制台程序使用,开始只引用Microsoft.Extensions.Configuration时加载json文件的AddJsonFile方法报异常,需要引用相同版本的Microsoft.Extensions.Configuration.Json类;这个问题解决后又有新的问题,不能绑定实体configuration.Get<Customer>()这个地方报错,需要引用相同版本的Microsoft.Extensions.Configuration.Binder类。