.NET 雲原生架構師訓練營(模組二 基礎鞏固 Host)--學習筆記
2.2.4 核心模組--Host
- 什麼是 Host
- Host 的預設配置做了哪些事情
- 框架提供的服務
- HostedService 後臺服務
ASP.NET Core Web 主機:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/host/web-host?view=aspnetcore-5.0
什麼是 Host
主機是封裝應用資源的物件,例如:
- 依賴關係注入(DI)
- Logging
- Configuration
- IHostedService 實現
對應 Program.cs 中的 host.Run();
可以在主機啟動前通過 CreateHostBuilder 進行配置
Host 的預設配置做了哪些事情
CreateHostBuilder 方法
- 將內容根目錄設定為由 GetCurrentDirectory 返回的路徑
- 載入主機配置(字首為 DOTNET_ 的環境變數;命令列引數)
- 載入應用配置(appsettings.json; appsettings.{Environment}.json; 金鑰管理器;環境變數;命令列引數)
- 新增日誌記錄程式(控制檯;除錯;EventSource;EventLog)
- 當環境為”開發“時,啟用範圍驗證和依賴關係驗證
- ConfigureWebHostDefaults(asp.net core 需要)
// 內容根目錄 var root = hostingContext.HostingEnvironment.ContentRootPath; // 環境 var envName = hostingContext.HostingEnvironment.EnvironmentName;
ConfigureWebHostDefaults 方法
- 從字首為 ASPNETCORE_ 的環境變數載入主機配置
- 使用應用的託管配置提供程式將 Kestrel 伺服器設定為 web 伺服器並對其進行配置
- 新增主機篩選中介軟體
- 如果 ASPNETCORE_FORWARDEDHEADERS_ENABLED 等於 true,則新增轉接頭中介軟體
- 支援 IIS 整合
框架提供的服務
- IHostApplicationLifetime
- IHostLifetime
- IHostEnvironment / IWebHostEnvironment
IHostApplicationLifetime
Program.cs
var applicationLifetime = host.Services.GetRequiredService<IHostApplicationLifetime>();
applicationLifetime.ApplicationStarted.Register((() =>
{
Console.WriteLine("Application Started");
}));
applicationLifetime.ApplicationStopping.Register((() =>
{
Console.WriteLine("Application Stopping");
}));
applicationLifetime.ApplicationStopped.Register((() =>
{
Console.WriteLine("Application Stopped");
}));
用於監控 Host 主機的啟動,停止
IHostLifetime
同樣的監聽
IHostEnvironment / IWebHostEnvironment
將 IHostEnvironment 服務註冊到一個類,獲取以下設定的資訊
- ApplicationName
- EnvironmentName
- ContentRootPath
HostedService 後臺服務
新建 MyHostedService.cs
namespace HelloApi.Services
{
public class MyHostedService : IHostedService
{
public Task StartAsync(CancellationToken cancellationToken)
{
throw new NotImplementedException();
}
public Task StopAsync(CancellationToken cancellationToken)
{
throw new NotImplementedException();
}
}
}
在 IHostedService 的基礎之上,asp .net core 還提供了另一個封裝 BackgroundService
public class MyBackgroundService : BackgroundService
{
protected override Task ExecuteAsync(CancellationToken stoppingToken)
{
throw new NotImplementedException();
}
}
在 StopAsync 之前會通過 CancellationToken 通知,執行一些操作
public class MyBackgroundService : BackgroundService
{
private readonly ILogger<MyBackgroundService> _logger;
public MyBackgroundService(ILogger<MyBackgroundService> logger)
{
_logger = logger;
}
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
// 只要不停止就一直執行
while (!stoppingToken.IsCancellationRequested)
{
_logger.LogInformation("date:{0}", DateTime.Now);
await Task.Delay(1000, stoppingToken);
}
}
}
在 Startup.cs 中注入
services.AddHostedService<MyBackgroundService>();
啟動程式,控制檯不斷輸出時間
請求介面也可以正常訪問
asp .net core 通過這樣一種 HostedService 的方式將後臺常駐服務與 web api 的請求同時放到一個託管基類
GitHub原始碼連結:
https://github.com/MINGSON666/Personal-Learning-Library/tree/main/ArchitectTrainingCamp/HelloApi
本作品採用知識共享署名-非商業性使用-相同方式共享 4.0 國際許可協議進行許可。
歡迎轉載、使用、重新發布,但務必保留文章署名 鄭子銘 (包含連結: http://www.cnblogs.com/MingsonZheng/ ),不得用於商業目的,基於本文修改後的作品務必以相同的許可釋出。
如有任何疑問,請與我聯絡 ([email protected]) 。