通常在程序发布后,配置文件的修改有时候也避免不了,如果能检测到文件的改动,这样不用重启.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.OnChangeChangeToken.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类。