詳解asp.net core重新加載應(yīng)用配置
asp.net core重新加載應(yīng)用配置Intro
我把配置放在了數(shù)據(jù)庫(kù)或者是Redis里,配置需要修改的時(shí)候我要直接修改數(shù)據(jù)庫(kù),然后調(diào)用一個(gè)接口去重新加載應(yīng)用配置,于是就嘗試寫(xiě)一個(gè)運(yùn)行時(shí)重新加載配置的接口。
Configuration 重新加載實(shí)現(xiàn)
重新加載配置的接口其實(shí)很簡(jiǎn)單,經(jīng)過(guò)看 Configuration 的源碼可以知道,如果想要重新加載應(yīng)用配置,需要一個(gè) IConfigurationRoot 對(duì)象,而 IConfigurationRoot 其實(shí)可以直接拿注入服務(wù)中的 IConfiguration 對(duì)象,服務(wù)中的 IConfiguration 對(duì)象也是實(shí)現(xiàn)了 IConfigurationRoot 接口的實(shí)例。后面我們一起看源碼就更清晰了。
來(lái)看實(shí)現(xiàn)重新加載配置的代碼
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 是一個(gè)自定義擴(kuò)展方法,獲取AppSettings 節(jié)點(diǎn)下的配置信息
});
}
[HttpPut]
public IActionResult Put()
{
_configuration.Reload();
return Ok();
}
}
}
是不是很簡(jiǎn)單,下面我們來(lái)嘗試一下,你可以參考這個(gè)示例項(xiàng)目
因?yàn)槟J(rèn)的項(xiàng)目配置會(huì)監(jiān)聽(tīng) appsettings.json 文件是否修改,如果已修改就會(huì)重新reload,這里我新加一個(gè)文件,這里設(shè)置 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 的文件內(nèi)容如下:
{
"AppSettings": {
"TestNumber": 12,
"RootUser": "WeihanLi"
}
}
dotnet run 啟動(dòng)網(wǎng)站,然后在瀏覽器中訪問(wèn) http://localhost:5000/api/configurations

然后我們修改 abc.json 文件
{
"AppSettings": {
"TestNumber": 12,
"RootUser": "WeihanLi 123"
}
}
修改保存之后刷新剛才的頁(yè)面,可以看到還是剛才的內(nèi)容,證明并沒(méi)有重新加載配置,接下來(lái)嘗試我們的重新加載配置方法
使用 postman 或 fiddler 或其他你喜歡的工具發(fā)一個(gè) PUT 請(qǐng)求到 http://localhost:5000/api/configurations,這里我使用 postman 調(diào)用 PUT 接口重新加載配置

返回 200 即接口調(diào)用成功,重新刷新剛才的頁(yè)面就可以看到頁(yè)面上的數(shù)據(jù)已經(jīng)發(fā)生變化,這也就證明了我們重新加載配置的接口生效了。

源碼解析
來(lái)看 ConfigurationBuilder 在 Build 的時(shí)候做了什么,ConfigurationBuilder 源碼

可以看到這里最后返回的是一個(gè) IConfigurationRoot 對(duì)象,再來(lái)看 IConfigurationRoot 源碼

可以看到 IConfigurationRoot 定義了一個(gè) Reload 的方法,這個(gè)方法會(huì)從下面的 Providers 中重新加載配置,看到這里我們就知道可以通過(guò) IConfiguration 的 Reload 方法來(lái)重新加載應(yīng)用程序的配置了,然后我們來(lái)看 WebHost.CreateDefaultBuilder(args).Build() 做了什么
https://github.com/aspnet/AspNetCore/blob/master/src/DefaultBuilder/src/WebHost.cs

這里我們可以看到為什么 appsettings.json 文件會(huì)自動(dòng) reload 配置,可以看到最后返回了一個(gè) WebHostBuilder 對(duì)象
看 Asp.Net core WebHostBuilder 對(duì)象的 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

上面我們已經(jīng)知道 ConfigurationBuilder Build 之后返回的是一個(gè) IConfigurationRoot 對(duì)象,而這里注入是一個(gè) IConfiguration 對(duì)象(IConfigurationRoot 實(shí)現(xiàn) IConfiguration 接口),所以我們就可以從依賴注入中獲取 IConfiguration 對(duì)象直接當(dāng)作 IConfigurationRoot 來(lái)使用,這也就是為什么我們會(huì)直接獲取一個(gè) IConfiguration 對(duì)象直接 as IConfigurationRoot
Memo
到此就暫時(shí)結(jié)束了,希望你能有所收獲~
以上所述是小編給大家介紹的asp.net core重新加載應(yīng)用配置詳解整合,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)請(qǐng)給我留言,小編會(huì)及時(shí)回復(fù)大家的。在此也非常感謝大家對(duì)腳本之家網(wǎng)站的支持!
相關(guān)文章
解決.Net Core項(xiàng)目發(fā)布在IIS上訪問(wèn)404的問(wèn)題
這篇文章介紹了解決.Net Core項(xiàng)目發(fā)布在IIS上訪問(wèn)404的問(wèn)題,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-12-12
.NET?Core?Web?APi類(lèi)庫(kù)內(nèi)嵌運(yùn)行的方法
這篇文章主要介紹了.NET?Core?Web?APi類(lèi)庫(kù)內(nèi)嵌運(yùn)行的方法,本節(jié)我們重點(diǎn)討論如何內(nèi)嵌運(yùn)行.NET Core Web APi類(lèi)庫(kù),同時(shí)介紹了兩種激活比如控制器特性方案,需要的朋友可以參考下2022-09-09
asp.net基礎(chǔ)學(xué)習(xí)之前端頁(yè)面布局
這篇文章主要為大家詳細(xì)介紹了asp.net基礎(chǔ)學(xué)習(xí)之前端頁(yè)面布局,什么是母版頁(yè),如何創(chuàng)建母版頁(yè),感興趣的小伙伴們可以參考一下2016-08-08
關(guān)于兩個(gè)自定義控件的取值問(wèn)題及接口的應(yīng)用
一個(gè).aspx的頁(yè)面中,用到了兩個(gè)用戶控件,其中想做的到A控件有一個(gè)按鈕,點(diǎn)擊的時(shí)候獲取到B控件中的一個(gè)textbox的值想必大家會(huì)使用findcontrol獲取控件吧,而在生成的時(shí)候名字是不確定的,那么如何書(shū)寫(xiě)呢?接下來(lái)為您提供詳細(xì)的解決方法,感興趣的朋友可以了解下啊2013-01-01
ASP.NET實(shí)現(xiàn)可以縮放和旋轉(zhuǎn)的圖片預(yù)覽頁(yè)效果
本文詳細(xì)介紹了如何在ASP.NET?WebForms中實(shí)現(xiàn)一個(gè)功能豐富的圖片預(yù)覽頁(yè)面,通過(guò)結(jié)合HTML、CSS和JavaScript,用戶可以方便地對(duì)圖片進(jìn)行放大、縮小以及旋轉(zhuǎn)操作,感興趣的朋友跟隨小編一起看看吧2024-08-08
給Asp.Net初學(xué)者的關(guān)于繼承和多態(tài)性的例子
給Asp.Net初學(xué)者的關(guān)于繼承和多態(tài)性的例子...2006-09-09
ASP.NET MVC 數(shù)據(jù)驗(yàn)證及相關(guān)內(nèi)容
這篇文章主要介紹了ASP.NET MVC 數(shù)據(jù)驗(yàn)證及相關(guān)內(nèi)容的相關(guān)資料,需要的朋友可以參考下2014-10-10

