这篇文章主要讲解了ASP。网络核心修改配置文件后怎么自动加载更新”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ASP。网络核心修改配置文件后怎么自动加载更新”吧!
<强>前言强>
在ASP。网络核心默认的应用程序模板中,配置文件的处理如下面的代码所示:
config.AddJsonFile ( ,路径:“appsettings.json", ,可选:没错, ,reloadOnChange:真的 ); config.AddJsonFile ( 美元,路径:“appsettings。{env.EnvironmentName} .json" ,可选:没错, ,reloadOnChange:真的 );
appsettings。json和appsettings。{env.EnvironmentName}。json两个配置文件都是可选的,并且支持当文件被修改时能够重新加载。
可以在ASP。网络核心应用中利用这个特性,实现修改配置文件之后,不需要重启应用,自动加载修改过的配置文件,从而减少系统停机的时间。实现的步骤如下:
<强>使用配置API进行注入强>
假设要在程序中注入这样一个配置类型:
public class WeatherOption { ,public string City {组,得到,,,} ,public int RefreshInterval {组,得到,,,} }
在appsettings。json中添加的配置如下:
{ ,“weather": { ,“city":,“GuangZhou" ,“refreshInterval": 120 ,} }
在启动。cs的ConfigureServices方法中使用配置API进行注入,代码如下:
public void ConfigureServices (IServiceCollection 服务),{ ,services.Configure(Configuration.GetSection (“weather")); ,services.AddControllers (); }
这个步骤很关键,通过这个配置API可以把注入内容和配置所在的节点关联起来。如果有兴趣了解底层实现的话,可以继续查看这个OptionsConfigurationServiceCollectionExtensions。cs .
引用>通过这种方式注册的内容,都是支持当配置文件被修改时,自动重新加载的。
<强>在控制器(控制器)中加载修改过后的配置强>
控制器(控制器)在ASP。网络核心应用的依赖注入容器中注册的生命周期是作用域,即每次请求都会创建新的控制器实例。这样只需要在控制器的构造函数中注入IOptionsSnapshot
参数即可,代码如下: [ApiController] (路线(“(控制器)“) 时间:public class  WeatherForecastController ControllerBase { ,private WeatherOption 选择; ,public WeatherForecastController ( ,IOptionsSnapshot选项 ,){=,,this.option  options.Value; ,} ,//GET /weatherforcase/选项 ,(HttpGet (“options")) ,public ActionResult GetOption (), { ,return 选择; ,} } 当然,如果不希望在控制器中使用这个IOptionsSnapshot接口类型(会带来一些对现有代码重构和修改,还是有一定的风险的),可以在ConfigureServices中添加对WeatherOption的注入,代码如下:
public void ConfigureServices (IServiceCollection 服务),{ ,services.Configure(Configuration.GetSection (“weather")); ,//添加对,WeatherOption 的注入,,生命周期为,Scoped ,,这样每次请求都可以获取新的配置值。 ,services.AddScoped (serviceProvider =祝辞,{ ,var snapshot =, serviceProvider.GetService 在(); ,return snapshot.Value; ,}); ,services.AddControllers (); } 这样在控制器中就不需要注入IOptionsSnapshot
类型了,最终控制器的代码如下: [ApiController] (路线(“(控制器)“) 时间:public class  WeatherForecastController ControllerBase { ,private WeatherOption 选择; ,public WeatherForecastController ( WeatherOption 选项 ,){=,this.option 选择; ,} ,//GET /weatherforcase/选项 ,(HttpGet (“options")) ,public ActionResultGetOption (), { ,return 选择; ,} } 这样控制器就无需修改任何代码即可加载修改过后的新配置。
<强>在中间件(中间件)中加载修改过后的配置强>
中间件(中间件)在ASP。网的核心应用的依赖注入容器中注册的生命周期是单例,即单例的,只有在当应用启动时,根据中间件创建处理连时创建一次全局实例,所以只能通过注入IOptionsMonitor
ASP。网络核心修改配置文件后怎么自动加载更新