asp.net core重新加载应用配置
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,这里我新加一个文件,这里设置 reloadOnChange
为 false
,示例代码如下:
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
中重新加载配置,看到这里我们就知道可以通过 IConfiguration
的 Reload
方法来重新加载应用程序的配置了,然后我们来看 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重新加载应用配置的更多相关文章
- asp.net core 教程(五)-配置
Asp.Net Core-配置 Asp.Net Core-配置 在这一章,我们将讨论 ASP.NET Core项目的相关的配置.在解决方案资源管理器中,您将看到 Startup.cs 文件.如果你有以 ...
- Orchard Module,Theme,Core扩展加载概述
Orchard 源码探索(Module,Theme,Core扩展加载概述) 参考: http://www.orchardch.com/Blog/20120830071458 1. host.Initi ...
- .Net Core·热加载的实现及测试
阅文时长 | 0.25分钟 字数统计 | 460字符 主要内容 | 1.引言&背景 2.解决原理&方法 3.声明与参考资料 『.Net Core·热加载的实现及测试』 编写人 | SC ...
- atitit.动态加载数据库配置in orm hibernate mybatis
atitit.动态加载数据库配置in orm 1. 动态加载数据库配置的优点::: 1 1.1. 组合多个配置文件... 1 1.2. 连接多个数据库 1 2. 基本的流程:::getCfg内存对象, ...
- Jquery zTree结合Asp.net实现异步加载数据
zTree结合Asp.net实现异步加载数据 实现简单操作 zTree 下载 api 访问 :http://www.ztree.me/v3/main.php 例子中用到json数据转化 newtons ...
- 在ASP.NET中动态加载内容(用户控件和模板)
在ASP.NET中动态加载内容(用户控件和模板) 要点: 1. 使用Page.ParseControl 2. 使用base.LoadControl 第一部分:加载模板 下 面是一个模板“<tab ...
- ASP.NET MVC中加载WebForms用户控件(.ascx)
原文:ASP.NET MVC中加载WebForms用户控件(.ascx) 问题背景 博客园博客中的日历用的是ASP.NET WebForms的日历控件(System.Web.UI.WebControl ...
- 写个重新加载 ocelot 配置的接口
写个重新加载 ocelot 配置的接口 Intro 我们想把 ocelot 的配置放在自己的存储中,放在 Redis 或者数据库中,当修改了 Ocelot 的配置之后希望即时生效,又不想在网关这边定时 ...
- ASP.NET MVC动态加载数据
ASP.NET MVC动态加载数据,一般的做法是使用$.each方法来循环产生tabel: 你可以在html时先写下非动态的部分: Source Code 上图中,有一行代码: <tbody ...
随机推荐
- mysql的SQL_NO_CACHE(在查询时不使用缓存)和sql_cache用法
转自:http://www.169it.com/article/5994930453423417575.html 为了测试sql语句的效率,有时候要不用缓存来查询. 使用 SELECT SQL_NO_ ...
- Go笔记之二:一个完整的播放器示例
Go笔记之二:一个完整的播放器示例 该示例从命令行运行一个播放器示例,可进行添加.删除.浏览和模拟播放,其内容是对 Go 语言接口使用的良好展示 源码及可执行文件 参考书籍<Go语言编程> ...
- python函数调用的四种方式 --基础重点
第一种:参数按顺序从第一个参数往后排#标准调用 # -*- coding: UTF-8 -*- def normal_invoke(x, y): print "--normal_invoke ...
- spring security4.2.2的maven配置+spring-security配置详解+java源码+数据库设计
最近项目需要添加权限拦截,经讨论决定采用spring security4.2.2!废话少说直接上干货! 若有不正之处,请谅解和批评指正,不胜感激!!!!! spring security 4.2.2文 ...
- angularJS--多个控制器之间的数据共享
为了在控制器之间共享数据,需要在服务中添加一个用来储存用户名的方法.记住,服务在 应用的生命周期内是单例模式的,因此可以将用户名安全地储存在其中. <!DOCTYPE html> < ...
- Java一次读取文本文件所有内容
转自https://www.cnblogs.com/longronglang/p/7458027.html#undefined 我们做文本处理的时候的最常用的就是读写文件了,尤其是读取文件,不论是什么 ...
- iOS之LLDB常用调试命令
LLDB是个开源的内置于XCode的调试工具,这里来理一理常用用法.lldb对于命令的简称,是头部匹配方式,只要不混淆,你可以随意简称某个命令.结果为在xcode下验证所得,可能与其它平台有所误差. ...
- 英国毕业原版-《伯明翰大学毕业证书》UoB一模一样原件
☞伯明翰大学毕业证书[微/Q:865121257◆WeChat:CC6669834]UC毕业证书/联系人Alice[查看点击百度快照查看][留信网学历认证&博士&硕士&海归&a ...
- Java基础-工厂设计模式(三锅的肥鸡)
---恢复内容开始--- 1)还没有工厂时代:假如还没有工业革命,如果一个你要一架飞机,一般的做法是自己去建造一架飞机,然后拿来开 通常的结果就是 有些时候 要么专科螺钉 没打好 要么就是 那个 ...
- mysql 使用Navicat Lite如何打开‘查询编辑器’,使用sql语句对表进行操作!
今天第一次使用mysql,尽然连查询编辑器都找不到,研究了半天,询问了下大牛,才搞出来,准备写下来,后面方面忘记了有查找的地方,哈哈哈~~ 如何打开"查询编辑器",使用sql语句进 ...