ASP.NETCore修改配置文件后怎么自動(dòng)加載更新-創(chuàng)新互聯(lián)

這篇文章主要講解了“ASP.NET Core修改配置文件后怎么自動(dòng)加載更新”,文中的講解內(nèi)容簡(jiǎn)單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來(lái)研究和學(xué)習(xí)“ASP.NET Core修改配置文件后怎么自動(dòng)加載更新”吧!

十多年的蒲縣網(wǎng)站建設(shè)經(jīng)驗(yàn),針對(duì)設(shè)計(jì)、前端、開(kāi)發(fā)、售后、文案、推廣等六對(duì)一服務(wù),響應(yīng)快,48小時(shí)及時(shí)工作處理。全網(wǎng)整合營(yíng)銷推廣的優(yōu)勢(shì)是能夠根據(jù)用戶設(shè)備顯示端的尺寸不同,自動(dòng)調(diào)整蒲縣建站的顯示方式,使網(wǎng)站能夠適用不同顯示終端,在瀏覽器中調(diào)整網(wǎng)站的寬度,無(wú)論在任何一種瀏覽器上瀏覽網(wǎng)站,都能展現(xiàn)優(yōu)雅布局與設(shè)計(jì),從而大程度地提升瀏覽體驗(yàn)。成都創(chuàng)新互聯(lián)公司從事“蒲縣網(wǎng)站設(shè)計(jì)”,“蒲縣網(wǎng)站推廣”以來(lái),每個(gè)客戶項(xiàng)目都認(rèn)真落實(shí)執(zhí)行。

前言

在 ASP.NET Core 默認(rèn)的應(yīng)用程序模板中, 配置文件的處理如下面的代碼所示:

config.AddJsonFile(
 path: "appsettings.json",
 optional: true,
 reloadOnChange: true
);
config.AddJsonFile(
 path: $"appsettings.{env.EnvironmentName}.json",
 optional: true,
 reloadOnChange: true
);

appsettings.json 和 appsettings.{env.EnvironmentName}.json 兩個(gè)配置文件都是可選的, 并且支持當(dāng)文件被修改時(shí)能夠重新加載。

可以在 ASP.NET Core 應(yīng)用中利用這個(gè)特性, 實(shí)現(xiàn)修改配置文件之后, 不需要重啟應(yīng)用, 自動(dòng)加載修改過(guò)的配置文件, 從而減少系統(tǒng)停機(jī)的時(shí)間。 實(shí)現(xiàn)的步驟如下:

使用配置 API 進(jìn)行注入

假設(shè)要在程序中注入這樣一個(gè)配置類型:

public class WeatherOption {
 public string City { get; set; }
 public int RefreshInterval { get; set; }
}

在 appsettings.json 中添加的配置如下:

{
 "weather": {
 "city": "GuangZhou",
 "refreshInterval": 120
 }
}

在 Startup.cs 的 ConfigureServices 方法中使用配置 API 進(jìn)行注入, 代碼如下:

public void ConfigureServices(IServiceCollection services) {
 services.Configure<WeatherOption>(Configuration.GetSection("weather"));
 services.AddControllers();
}

這個(gè)步驟很關(guān)鍵, 通過(guò)這個(gè)配置 API 可以把注入內(nèi)容和配置所在的節(jié)點(diǎn)關(guān)聯(lián)起來(lái)。 如果有興趣了解底層實(shí)現(xiàn)的話, 可以繼續(xù)查看這個(gè) OptionsConfigurationServiceCollectionExtensions.cs 。

通過(guò)這種方式注冊(cè)的內(nèi)容, 都是支持當(dāng)配置文件被修改時(shí), 自動(dòng)重新加載的。

在控制器 (Controller) 中加載修改過(guò)后的配置

控制器 (Controller) 在 ASP.NET Core 應(yīng)用的依賴注入容器中注冊(cè)的生命周期是 Scoped , 即每次請(qǐng)求都會(huì)創(chuàng)建新的控制器實(shí)例。 這樣只需要在控制器的構(gòu)造函數(shù)中注入 IOptionsSnapshot<TOption> 參數(shù)即可, 代碼如下:

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase {

 private WeatherOption option;

 public WeatherForecastController(
 IOptionsSnapshot<WeatherOption> options
 ) {
 this.option = options.Value;
 }

 // GET /weatherforcase/options
 [HttpGet("options")]
 public ActionResult<WeatherOption> GetOption() {
 return options;
 }
}

當(dāng)然, 如果不希望在控制器中使用這個(gè) IOptionsSnapshot 接口類型(會(huì)帶來(lái)一些對(duì)現(xiàn)有代碼重構(gòu)和修改, 還是有一定的風(fēng)險(xiǎn)的), 可以在 ConfigureServices 中添加對(duì) WeatherOption 的注入, 代碼如下:

public void ConfigureServices(IServiceCollection services) {
 services.Configure<WeatherOption>(Configuration.GetSection("weather"));
 // 添加對(duì) WeatherOption 的注入, 生命周期為 Scoped , 這樣每次請(qǐng)求都可以獲取新的配置值。
 services.AddScoped(serviceProvider => {
 var snapshot = serviceProvider.GetService<IOptionsSnapshot<WeatherOption>>();
 return snapshot.Value;
 });
 services.AddControllers();
}

這樣在控制器中就不需要注入 IOptionsSnapshot<T> 類型了, 最終控制器的代碼如下:

[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase {

 private WeatherOption option;

 public WeatherForecastController(
 WeatherOption option
 ) {
 this.option = option;
 }

 // GET /weatherforcase/options
 [HttpGet("options")]
 public ActionResult<WeatherOption> GetOption() {
 return options;
 }
}

這樣控制器就無(wú)需修改任何代碼即可加載修改過(guò)后的新配置。

在中間件 (Middleware) 中加載修改過(guò)后的配置

中間件 (Middleware) 在 ASP.NET Core 應(yīng)用的依賴注入容器中注冊(cè)的生命周期是 Singleton , 即單例的, 只有在當(dāng)應(yīng)用啟動(dòng)時(shí), 根據(jù)中間件創(chuàng)建處理連時(shí)創(chuàng)建一次全局實(shí)例, 所以只能通過(guò)注入 IOptionsMonitor<T> 來(lái)監(jiān)聽(tīng)配置文件的修改情況, 示例代碼如下:

public class TestMiddleware {

 private RequestDelegate next;
 private WeatherOption option;

 public TestMiddleware(
 RequestDelegate next,
 IOptionsMonitor<WeatherOption> monitor
 ) {
 this.next = next;
 option = monitor.CurrentValue;
 // moni config change
 monitor.OnChange(newValue => {
  option = newValue;
 });
 }

 public async Task Invoke(HttpContext context) {
 await context.Response.WriteAsync(JsonSerializer.Serialize(option));
 }

}

當(dāng)然, 在中間件的 Task Invoke(HttpContext context) 方法中, 直接獲取 IOptionsSnapshot<T> 也是可以的, 代碼如下:

public async Task Invoke(HttpContext context) {
 var snapshot = context.RequestServices.GetService<IOptionsSnapshot<WeatherOption>>();
 await context.Response.WriteAsync(JsonSerializer.Serialize(snapshot.Value));
}

但是這么做的話, 似乎就偏離了依賴注入的原則了, 因此不推薦這種做法。

總結(jié)

感謝各位的閱讀,以上就是“ASP.NET Core修改配置文件后怎么自動(dòng)加載更新”的內(nèi)容了,經(jīng)過(guò)本文的學(xué)習(xí)后,相信大家對(duì)ASP.NET Core修改配置文件后怎么自動(dòng)加載更新這一問(wèn)題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián)網(wǎng)站建設(shè)公司,,小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!

分享文章:ASP.NETCore修改配置文件后怎么自動(dòng)加載更新-創(chuàng)新互聯(lián)
鏈接地址:http://muchs.cn/article28/dsjhjp.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供Google、建站公司搜索引擎優(yōu)化、網(wǎng)站設(shè)計(jì)公司企業(yè)建站、軟件開(kāi)發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

網(wǎng)站優(yōu)化排名