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(); } } }
是不是很简单,下面我们来尝试一下,你可以参考这个示例项目
因为默认的项目配置会监听 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
这里我们可以看到为什么 appsettings.json 文件会自动 reload 配置,可以看到最后返回了一个 WebHostBuilder
对象
看 Asp.Net core WebHostBuilder
对象的 Build
方法 https://github.com/aspnet/AspNetCore/blob/master/src/Hosting/Hosting/src/WebHostBuilder.cs
在 BuildCommonServices
可以看到这样一段代码 https://github.com/aspnet/AspNetCore/blob/master/src/Hosting/Hosting/src/WebHostBuilder.cs
上面我们已经知道 ConfigurationBuilder
Build 之后返回的是一个 IConfigurationRoot
对象,而这里注入是一个 IConfiguration
对象(IConfigurationRoot
实现 IConfiguration
接口),所以我们就可以从依赖注入中获取 IConfiguration
对象直接当作 IConfigurationRoot
来使用,这也就是为什么我们会直接获取一个 IConfiguration
对象直接 as IConfigurationRoot
Memo
到此就暂时结束了,希望你能有所收获~
以上所述是小编给大家介绍的asp.net core重新加载应用配置详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对网站的支持!
《魔兽世界》大逃杀!60人新游玩模式《强袭风暴》3月21日上线
暴雪近日发布了《魔兽世界》10.2.6 更新内容,新游玩模式《强袭风暴》即将于3月21 日在亚服上线,届时玩家将前往阿拉希高地展开一场 60 人大逃杀对战。
艾泽拉斯的冒险者已经征服了艾泽拉斯的大地及遥远的彼岸。他们在对抗世界上最致命的敌人时展现出过人的手腕,并且成功阻止终结宇宙等级的威胁。当他们在为即将于《魔兽世界》资料片《地心之战》中来袭的萨拉塔斯势力做战斗准备时,他们还需要在熟悉的阿拉希高地面对一个全新的敌人──那就是彼此。在《巨龙崛起》10.2.6 更新的《强袭风暴》中,玩家将会进入一个全新的海盗主题大逃杀式限时活动,其中包含极高的风险和史诗级的奖励。
《强袭风暴》不是普通的战场,作为一个独立于主游戏之外的活动,玩家可以用大逃杀的风格来体验《魔兽世界》,不分职业、不分装备(除了你在赛局中捡到的),光是技巧和战略的强弱之分就能决定出谁才是能坚持到最后的赢家。本次活动将会开放单人和双人模式,玩家在加入海盗主题的预赛大厅区域前,可以从强袭风暴角色画面新增好友。游玩游戏将可以累计名望轨迹,《巨龙崛起》和《魔兽世界:巫妖王之怒 经典版》的玩家都可以获得奖励。