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主機是封裝應用資源的對象,例如:
- 依賴關系注入(DI)
- Logging
- Configuration
- IHostedService 實作
對應 Program.cs 中的 host.Run();
可以在主機啟動前通過 CreateHostBuilder 進行配置
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
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 主機的啟動,停止
同樣的監聽
将 IHostEnvironment 服務注冊到一個類,擷取以下設定的資訊
- ApplicationName
- EnvironmentName
- ContentRootPath
建立 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 的請求同時放到一個托管基類