博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
asp.net core重新加载应用配置
阅读量:6854 次
发布时间:2019-06-26

本文共 2737 字,大约阅读时间需要 9 分钟。

asp.net core重新加载应用配置

Intro#
我把配置放在了数据库或者是Redis里,配置需要修改的时候我要直接修改数据库,然后调用一个接口去重新加载应用配置,于是就尝试写一个运行时重新加载配置的接口。

Configuration 重新加载实现#

重新加载配置的接口其实很简单,经过看 Configuration 的源码可以知道,如果想要重新加载应用配置,需要一个 IConfigurationRoot 对象,而 IConfigurationRoot 其实可以直接拿注入服务中的 IConfiguration 对象,服务中的 IConfiguration 对象也是实现了 IConfigurationRoot 接口的实例。后面我们一起看源码就更清晰了。

来看实现重新加载配置的代码

Copy

using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Configuration;

namespace TestWebApplication.Controllers

{

[Route("api/[controller]")]public class ConfigurationsController : Controller{    private readonly IConfigurationRoot _configuration;    public ConfigurationsController(IConfiguration configuration)    {        _configuration = configuration as IConfigurationRoot;    }    [HttpGet]    public IActionResult Get()    {        return Ok(new        {            RootUser = _configuration.GetAppSetting("RootUser") // 这里 GetAppSetting 是一个自定义扩展方法,获取AppSettings 节点下的配置信息        });    }    [HttpPut]    public IActionResult Put()    {        _configuration.Reload();        return Ok();    }}

}

是不是很简单,下面我们来尝试一下,你可以参考这个示例项目

因为默认的项目配置会监听 appsettings.json 文件是否修改,如果已修改就会重新reload,这里我新加一个文件,这里设置 reloadOnChange 为 false,示例代码如下:

Copy

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>

WebHost.CreateDefaultBuilder(args)            .ConfigureAppConfiguration(configBuilder =>            {                configBuilder.AddJsonFile("abc.json", optional: true, reloadOnChange: false);            })            .UseStartup
();

abc.json 的文件内容如下:

Copy

{
"AppSettings": {

"TestNumber": 12,"RootUser": "WeihanLi"

}

}
dotnet run 启动网站,然后在浏览器中访问

然后我们修改 abc.json 文件

Copy

{
"AppSettings": {

"TestNumber": 12,"RootUser": "WeihanLi 123"

}

}
修改保存之后刷新刚才的页面,可以看到还是刚才的内容,证明并没有重新加载配置,接下来尝试我们的重新加载配置方法

使用 postman 或 fiddler 或其他你喜欢的工具发一个 PUT 请求到 ,这里我使用 postman 调用 PUT 接口重新加载配置

reload configuration

返回 200 即接口调用成功,重新刷新刚才的页面就可以看到页面上的数据已经发生变化,这也就证明了我们重新加载配置的接口生效了。

源码解析#

来看 ConfigurationBuilder 在 Build 的时候做了什么,ConfigurationBuilder 源码

ConfigurationBuilder.Build()

可以看到这里最后返回的是一个 IConfigurationRoot 对象,再来看 IConfigurationRoot 源码

IConfigurationRoot

可以看到 IConfigurationRoot 定义了一个 Reload 的方法,这个方法会从下面的 Providers 中重新加载配置,看到这里我们就知道可以通过 IConfiguration 的 Reload 方法来重新加载应用程序的配置了,然后我们来看 WebHost.CreateDefaultBuilder(args).Build() 做了什么

WebHost

这里我们可以看到为什么 appsettings.json 文件会自动 reload 配置,可以看到最后返回了一个 WebHostBuilder 对象

看 Asp.Net core WebHostBuilder 对象的 Build 方法

在 BuildCommonServices 可以看到这样一段代码

image.png

上面我们已经知道 ConfigurationBuilder Build 之后返回的是一个 IConfigurationRoot 对象,而这里注入是一个 IConfiguration 对象(IConfigurationRoot 实现 IConfiguration 接口),所以我们就可以从依赖注入中获取 IConfiguration 对象直接当作 IConfigurationRoot 来使用,这也就是为什么我们会直接获取一个 IConfiguration 对象直接 as IConfigurationRoot

Memo#

到此就暂时结束了,希望你能有所收获~
原文地址

转载地址:http://oyfyl.baihongyu.com/

你可能感兴趣的文章
LVS+Keepalived+nginx+单纯keepalived高可用
查看>>
6752/6732平台使用512MB RAM时 Camera配置方法
查看>>
AVAudioPlayer音频播放器—IOS开发
查看>>
oracle 查询的结果自动换行
查看>>
交换机xmodem灌IOS
查看>>
KeyMob聚合 我是最稳定的
查看>>
css中display的属性值---block VS inline(none就不用显示了)
查看>>
mongodb里日期类型的时区问题
查看>>
CentOS7 部署docker
查看>>
我的友情链接
查看>>
001:操作系统概述
查看>>
6:多源复制的实现
查看>>
amMap地理的统计图表
查看>>
解决v-lazy-image在qq浏览器x5内核下无效
查看>>
HttpClient Timeout设置
查看>>
透析C语言可变参数问题
查看>>
安装mysql!
查看>>
2.9 类和结构体
查看>>
修改环境变量的几种方法
查看>>
Access restriction: The constructor SunJCE() is not accessible
查看>>