.NET Core使ChangeToken.OnChange检测配置文件更改

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

修改邮箱地址保存

.NET Core使ChangeToken.OnChange检测配置文件更改

修改后的邮箱,不用重启,自动变更为新的地址

.NET Core使ChangeToken.OnChange检测配置文件更改

这就实现了配置文件热更新的读取,此方法支持.NET 3.1以上版本,大家可以尝试一试。

遇到的坑:

    在控制台程序使用,开始只引用Microsoft.Extensions.Configuration时加载json文件的AddJsonFile方法报异常,需要引用相同版本的Microsoft.Extensions.Configuration.Json类;这个问题解决后又有新的问题,不能绑定实体configuration.Get<Customer>()这个地方报错,需要引用相同版本的Microsoft.Extensions.Configuration.Binder类。