詳解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
接口),所以我們就可以從依賴(lài)注入中獲取 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下實(shí)現(xiàn)Word動(dòng)態(tài)填加數(shù)據(jù)打印
.net下實(shí)現(xiàn)Word動(dòng)態(tài)填加數(shù)據(jù)打印...2007-04-04.net中自定義錯(cuò)誤頁(yè)面的實(shí)現(xiàn)升級(jí)篇
這篇文章主要給大家介紹了關(guān)于.net中自定義錯(cuò)誤頁(yè)面實(shí)現(xiàn)的相關(guān)資料,這篇文章是之前的升級(jí)篇,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2018-06-06ASP.NET?MVC使用Log4Net記錄異常日志并跳轉(zhuǎn)到靜態(tài)頁(yè)
這篇文章介紹了ASP.NET?MVC使用Log4Net記錄異常日志并跳轉(zhuǎn)到靜態(tài)頁(yè)的方法,文中通過(guò)示例代碼介紹的非常詳細(xì)。對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-09-09asp.net 數(shù)據(jù)綁定的實(shí)例代碼
這篇文章介紹了asp.net 數(shù)據(jù)綁定的實(shí)例代碼,有需要的朋友可以參考一下2013-07-07.net通過(guò)Action進(jìn)行Options參數(shù)的傳遞的方法
在.NET Core中,使用Action和Options參數(shù)方式配置服務(wù)并將配置信息對(duì)象注冊(cè)到IServiceCollection的好處在于,它提供了更高級(jí)別的可配置性和可擴(kuò)展性,這篇文章主要介紹了.net通過(guò)Action進(jìn)行Options參數(shù)的傳遞,你知道是怎么實(shí)現(xiàn)的嗎,需要的朋友可以參考下2023-12-12ASP.NET Core中間件初始化的實(shí)現(xiàn)
在日常使用ASP.NET Core開(kāi)發(fā)的過(guò)程中我們多多少少會(huì)設(shè)計(jì)到使用中間件的場(chǎng)景,本文探究了ASP.NET Core中間件是如何初始化的,感興趣的可以了解一下2021-05-05JavaScript驗(yàn)證用戶(hù)輸入的是字符或數(shù)字及ASCII Chart應(yīng)用
我們可以根據(jù)onkeydown事件的event.keyCode即是ASCII Chart來(lái)判斷字符或數(shù)字等,本文提供了相關(guān)鍵盤(pán)key對(duì)應(yīng)的ASCII碼,以供用戶(hù)使用是參考及使用onpaste事件只能輸入字符和數(shù)字防止粘貼等的,感興趣的朋友可以了解下2013-01-01asp.net 利用IIS的404錯(cuò)誤將文件重寫(xiě)成目錄的簡(jiǎn)單方法
為什么要把文件重寫(xiě)成目錄,主要原因是討好搜索引擎,至于為什么寫(xiě)成目錄搜索引擎就比較容易搜錄不在本文討論范圍之內(nèi)。2009-09-09