詳解asp.net core重新加載應用配置
asp.net core重新加載應用配置Intro
我把配置放在了數(shù)據(jù)庫或者是Redis里,配置需要修改的時候我要直接修改數(shù)據(jù)庫,然后調用一個接口去重新加載應用配置,于是就嘗試寫一個運行時重新加載配置的接口。
Configuration 重新加載實現(xiàn)
重新加載配置的接口其實很簡單,經過看 Configuration 的源碼可以知道,如果想要重新加載應用配置,需要一個 IConfigurationRoot 對象,而 IConfigurationRoot 其實可以直接拿注入服務中的 IConfiguration 對象,服務中的 IConfiguration 對象也是實現(xiàn)了 IConfigurationRoot 接口的實例。后面我們一起看源碼就更清晰了。
來看實現(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 是一個自定義擴展方法,獲取AppSettings 節(jié)點下的配置信息
});
}
[HttpPut]
public IActionResult Put()
{
_configuration.Reload();
return Ok();
}
}
}
是不是很簡單,下面我們來嘗試一下,你可以參考這個示例項目
因為默認的項目配置會監(jiān)聽 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 啟動網(wǎng)站,然后在瀏覽器中訪問 http://localhost:5000/api/configurations

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

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

源碼解析
來看 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 實現(xiàn) IConfiguration 接口),所以我們就可以從依賴注入中獲取 IConfiguration 對象直接當作 IConfigurationRoot 來使用,這也就是為什么我們會直接獲取一個 IConfiguration 對象直接 as IConfigurationRoot
Memo
到此就暫時結束了,希望你能有所收獲~
以上所述是小編給大家介紹的asp.net core重新加載應用配置詳解整合,希望對大家有所幫助,如果大家有任何疑問請給我留言,小編會及時回復大家的。在此也非常感謝大家對腳本之家網(wǎng)站的支持!
相關文章
.net下實現(xiàn)Word動態(tài)填加數(shù)據(jù)打印
.net下實現(xiàn)Word動態(tài)填加數(shù)據(jù)打印...2007-04-04
ASP.NET?MVC使用Log4Net記錄異常日志并跳轉到靜態(tài)頁
這篇文章介紹了ASP.NET?MVC使用Log4Net記錄異常日志并跳轉到靜態(tài)頁的方法,文中通過示例代碼介紹的非常詳細。對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-09-09
.net通過Action進行Options參數(shù)的傳遞的方法
在.NET Core中,使用Action和Options參數(shù)方式配置服務并將配置信息對象注冊到IServiceCollection的好處在于,它提供了更高級別的可配置性和可擴展性,這篇文章主要介紹了.net通過Action進行Options參數(shù)的傳遞,你知道是怎么實現(xiàn)的嗎,需要的朋友可以參考下2023-12-12
JavaScript驗證用戶輸入的是字符或數(shù)字及ASCII Chart應用
我們可以根據(jù)onkeydown事件的event.keyCode即是ASCII Chart來判斷字符或數(shù)字等,本文提供了相關鍵盤key對應的ASCII碼,以供用戶使用是參考及使用onpaste事件只能輸入字符和數(shù)字防止粘貼等的,感興趣的朋友可以了解下2013-01-01
asp.net 利用IIS的404錯誤將文件重寫成目錄的簡單方法
為什么要把文件重寫成目錄,主要原因是討好搜索引擎,至于為什么寫成目錄搜索引擎就比較容易搜錄不在本文討論范圍之內。2009-09-09

