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

Intro

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

Configuration 重新加载实现

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

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

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();
}
}
}

精简版

        /// <summary>
/// 重新加载系统配置
/// </summary>
/// <returns></returns>
public IActionResult ReloadConfiguration()
{
var configurationRoot = HttpContext.RequestServices.GetService<IConfiguration>() as IConfigurationRoot;
if (null == configurationRoot)
{
return BadRequest();
}
configurationRoot.Reload();
return Ok();
}

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

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

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.ConfigureAppConfiguration(configBuilder =>
{
configBuilder.AddJsonFile("abc.json", optional: true, reloadOnChange: false);
})
.UseStartup<Startup>();

abc.json 的文件内容如下:

{
"AppSettings": {
"TestNumber": 12,
"RootUser": "WeihanLi"
}
}

dotnet run 启动网站,然后在浏览器中访问 http://localhost:5000/api/configurations

然后我们修改 abc.json 文件

{
"AppSettings": {
"TestNumber": 12,
"RootUser": "WeihanLi 123"
}
}

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

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

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

源码解析

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

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

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

https://github.com/aspnet/AspNetCore/blob/master/src/DefaultBuilder/src/WebHost.cs#L149

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

看 Asp.Net core WebHostBuilder 对象的 Build 方法 https://github.com/aspnet/AspNetCore/blob/master/src/Hosting/Hosting/src/WebHostBuilder.cs#L135

BuildCommonServices 可以看到这样一段代码 https://github.com/aspnet/AspNetCore/blob/master/src/Hosting/Hosting/src/WebHostBuilder.cs#L277

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

Memo

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

asp.net core重新加载应用配置的更多相关文章

  1. asp.net core 教程(五)-配置

    Asp.Net Core-配置 Asp.Net Core-配置 在这一章,我们将讨论 ASP.NET Core项目的相关的配置.在解决方案资源管理器中,您将看到 Startup.cs 文件.如果你有以 ...

  2. Orchard Module,Theme,Core扩展加载概述

    Orchard 源码探索(Module,Theme,Core扩展加载概述) 参考: http://www.orchardch.com/Blog/20120830071458 1. host.Initi ...

  3. .Net Core·热加载的实现及测试

    阅文时长 | 0.25分钟 字数统计 | 460字符 主要内容 | 1.引言&背景 2.解决原理&方法 3.声明与参考资料 『.Net Core·热加载的实现及测试』 编写人 | SC ...

  4. atitit.动态加载数据库配置in orm hibernate mybatis

    atitit.动态加载数据库配置in orm 1. 动态加载数据库配置的优点::: 1 1.1. 组合多个配置文件... 1 1.2. 连接多个数据库 1 2. 基本的流程:::getCfg内存对象, ...

  5. Jquery zTree结合Asp.net实现异步加载数据

    zTree结合Asp.net实现异步加载数据 实现简单操作 zTree 下载 api 访问 :http://www.ztree.me/v3/main.php 例子中用到json数据转化 newtons ...

  6. 在ASP.NET中动态加载内容(用户控件和模板)

    在ASP.NET中动态加载内容(用户控件和模板) 要点: 1. 使用Page.ParseControl 2. 使用base.LoadControl 第一部分:加载模板 下 面是一个模板“<tab ...

  7. ASP.NET MVC中加载WebForms用户控件(.ascx)

    原文:ASP.NET MVC中加载WebForms用户控件(.ascx) 问题背景 博客园博客中的日历用的是ASP.NET WebForms的日历控件(System.Web.UI.WebControl ...

  8. 写个重新加载 ocelot 配置的接口

    写个重新加载 ocelot 配置的接口 Intro 我们想把 ocelot 的配置放在自己的存储中,放在 Redis 或者数据库中,当修改了 Ocelot 的配置之后希望即时生效,又不想在网关这边定时 ...

  9. ASP.NET MVC动态加载数据

    ASP.NET MVC动态加载数据,一般的做法是使用$.each方法来循环产生tabel: 你可以在html时先写下非动态的部分:  Source Code 上图中,有一行代码: <tbody ...

随机推荐

  1. 用Promise实现:带延时功能的链式调用

    // 1) 调用方式 new People('whr').sleep(3).eat('apple').sleep(5).eat('durian'); // 2) 打印结果 'hello, whr' - ...

  2. RocketMQ部分数据消费不了问题排查

    问题现象 今天忽然收到RocketMQ预警信息如下: 提醒有部分数据没有消费,产生堆积情况. 打开RocketMq-Console-Ng查看如下图形式: 备注:第一反应是Consumer Group内 ...

  3. VC++中字符串编码处理的一些相关问题

    前言 什么是tchar? 百度百科对其的定义如下": 因为C++支持两种字符串,即常规的ANSI编码(使用""包裹)和Unicode编码(使用L""包 ...

  4. Myeclipse10.7.1 导出war包报错

    myeclipse10.7.1 导出war问题解决办法myeclipse10破解后,导出war包时报"SECURITY ALERT: INTEGERITY CHECK ERROR" ...

  5. Oracle-01:基础命令小结

    ------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 记录一下我的Oracle学习之路,详细的安装教程忙完这俩天会认真总结一版 本次记录这次学习cmd基础命令 一, ...

  6. tkinter中spinbox递增和递减控件(十)

    spinbox递增和递减控件 import tkinter wuya = tkinter.Tk() wuya.title("wuya") wuya.geometry("3 ...

  7. Java集合排序及java集合类详解--(Collection, List, Set, Map)

    1         集合框架 1.1         集合框架概述 1.1.1         容器简介 到目前为止,我们已经学习了如何创建多个不同的对象,定义了这些对象以后,我们就可以利用它们来做一 ...

  8. 巩固java(五)----通过实例理解java多态

    package duotai; class A{ public String show(){ return "A"; } } class B extends A{ public S ...

  9. HTML5 CSS3专题 纯CSS打造相册效果

    转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/30993277 今天偶然发现电脑里面还有这样的一个例子,感觉效果还不错,不记得啥时 ...

  10. 安装vmtools之后任然不能在虚拟机和主机之间复制粘贴的问题

    安装vmtools之后任然不能在虚拟机和主机之间复制粘贴的问题 都是因为这个进程没有启动起来,你只需要在启动后在终端输入 "/usr/bin /vmware-user" 就可以手动 ...