ASP.NET?Core中的通用主機(jī)HostBuilder
1.前言
ASP.NET Core應(yīng)用程序可以配置和啟動(dòng)主機(jī)(Host)。主機(jī)負(fù)責(zé)應(yīng)用程序啟動(dòng)和生命周期管理。通用主機(jī)用于無法處理HTTP請(qǐng)求的應(yīng)用程序。通用主機(jī)的用途是將HTTP管道從Web主機(jī)API中分離出來,從而啟用更多的主機(jī)方案。 基于通用主機(jī)的消息、后臺(tái)任務(wù)和其他非HTTP工作負(fù)載可從橫切功能(如配置、依賴關(guān)系注入[DI]和日志記錄)中受益。通用主機(jī)是ASP.NET Core 2.1中的新增功能,不適用于Web承載方案。對(duì)于Web承載方案,請(qǐng)使用Web主機(jī)。通用主機(jī)將在未來版本中替換Web主機(jī),并在HTTP和非HTTP方案中充當(dāng)主要的主機(jī)API。
2.介紹
IHostedService是執(zhí)行代碼的入口點(diǎn)。每個(gè)IHostedService實(shí)現(xiàn)都按照ConfigureServices中服務(wù)注冊(cè)的順序執(zhí)行。主機(jī)啟動(dòng)時(shí),每個(gè)IHostedService上都會(huì)調(diào)用StartAsync,主機(jī)正常關(guān)閉時(shí),以反向注冊(cè)順序調(diào)用StopAsync。
3.設(shè)置主機(jī)
IHostBuilder是供庫(kù)和應(yīng)用程序初始化、生成和運(yùn)行主機(jī)的主要組件:
public static async Task Main(string[] args) { var host = new HostBuilder().Build(); await host.RunAsync(); }
4.選項(xiàng)
HostOptions配置IHost的選項(xiàng)。
4.1關(guān)閉超時(shí)值
ShutdownTimeout設(shè)置StopAsync的超時(shí)值。默認(rèn)值為5秒。Program.Main中的以下選項(xiàng)配置將默認(rèn)值為5秒的關(guān)閉超時(shí)值增加至20秒:
var host = new HostBuilder().ConfigureServices((hostContext, services) => { services.Configure<HostOptions>(option => { option.ShutdownTimeout = System.TimeSpan.FromSeconds(20); }); }) .Build();
5.默認(rèn)服務(wù)
在主機(jī)初始化期間注冊(cè)以下服務(wù):
- 環(huán)境 (IHostingEnvironment)
- HostBuilderContext
- 配置 (IConfiguration)
- IApplicationLifetime (ApplicationLifetime)
- IHostLifetime (ConsoleLifetime)
- IHost
- 選項(xiàng) (AddOptions)
- 日志記錄 (AddLogging)
6.主機(jī)配置
主機(jī)配置的創(chuàng)建方式如下:
- 調(diào)用IHostBuilder上的擴(kuò)展方法以設(shè)置“內(nèi)容根”和“環(huán)境”。
- 從ConfigureHostConfiguration中的配置提供應(yīng)用程序讀取配置。
- 應(yīng)用程序鍵(名稱)、內(nèi)容根、環(huán)境配置方式我就不多說了,跟上一篇Web主機(jī)配置是一樣的。
6.1ConfigureHostConfiguration
ConfigureHostConfiguration使用IConfigurationBuilder來為主機(jī)創(chuàng)建IConfiguration。主機(jī)配置用于初始化IHostingEnvironment,以供在應(yīng)用程序的構(gòu)建過程中使用。可多次調(diào)用ConfigureHostConfiguration,并得到累計(jì)結(jié)果。必須在ConfigureHostConfiguration中顯式指定應(yīng)用程序所需的任何配置提供自身,包括:
- 文件配置(例如,來自hostsettings.json文件)。
- 環(huán)境變量配置。
- 命令行參數(shù)配置。
- 任何其他所需的配置提供程序。
通過使用SetBasePath指定應(yīng)用程序的基本路徑,然后調(diào)用其中一個(gè)文件配置提供應(yīng)用程序,可以啟用主機(jī)的文件配置。示例應(yīng)用使用JSON文件hostsettings.json,并調(diào)用AddJsonFile來使用文件的主機(jī)配置設(shè)置。要添加主機(jī)的環(huán)境變量配置,請(qǐng)?jiān)谥鳈C(jī)生成器上調(diào)用 AddEnvironmentVariables。AddEnvironmentVariables接受用戶定義的前綴(可選)。示例應(yīng)用程序使用前綴PREFIX_。當(dāng)系統(tǒng)讀取環(huán)境變量時(shí),便會(huì)刪除前綴。配置示例應(yīng)用程序的主機(jī)后,PREFIX_ENVIRONMENT的環(huán)境變量值就變成environment密鑰的主機(jī)配置值。示例HostBuilder配置使用ConfigureHostConfiguration:
var host = new HostBuilder().ConfigureHostConfiguration(configHost => { configHost.SetBasePath(Directory.GetCurrentDirectory()); configHost.AddJsonFile("hostsettings.json", optional: true); configHost.AddEnvironmentVariables(prefix: "PREFIX_"); configHost.AddCommandLine(args); })
6.2ConfigureAppConfiguration
通過在IHostBuilder實(shí)現(xiàn)上調(diào)用ConfigureAppConfiguration創(chuàng)建應(yīng)用程序配置。ConfigureAppConfiguration使用IConfigurationBuilder來為應(yīng)用程序創(chuàng)建IConfiguration。可多次調(diào)用ConfigureAppConfiguration,并得到累計(jì)結(jié)果。應(yīng)用程序使用上一次在一個(gè)給定鍵上設(shè)置值的選項(xiàng)。HostBuilderContext.Configuration中提供ConfigureAppConfiguration創(chuàng)建的配置,以供進(jìn)行后續(xù)操作和在Services中使用。應(yīng)用程序配置會(huì)自動(dòng)接收ConfigureHostConfiguration提供的主機(jī)配置。示例應(yīng)用配置使用ConfigureAppConfiguration:
var host = new HostBuilder().ConfigureAppConfiguration((hostContext, configApp) => { configApp.SetBasePath(Directory.GetCurrentDirectory()); configApp.AddJsonFile("appsettings.json", optional: true); configApp.AddJsonFile( $"appsettings.{hostContext.HostingEnvironment.EnvironmentName}.json", optional: true); configApp.AddEnvironmentVariables(prefix: "PREFIX_"); configApp.AddCommandLine(args); })
6.3ConfigureServices
ConfigureServices將服務(wù)添加到應(yīng)用程序的依賴關(guān)系注入容器??啥啻握{(diào)用ConfigureServices,并得到累計(jì)結(jié)果。托管服務(wù)是一個(gè)類,具有實(shí)現(xiàn)IHostedService接口的后臺(tái)任務(wù)邏輯。示例應(yīng)用程序使用AddHostedService擴(kuò)展方法向自身添加生命周期事件 LifetimeEventsHostedService和定時(shí)后臺(tái)任務(wù)TimedHostedService服務(wù):
var host = new HostBuilder() .ConfigureServices((hostContext, services) => { if (hostContext.HostingEnvironment.IsDevelopment()) { // Development service configuration } else { // Non-development service configuration } services.AddHostedService<LifetimeEventsHostedService>(); services.AddHostedService<TimedHostedService>(); })
6.4ConfigureLogging
ConfigureLogging添加了一個(gè)委托來配置提供的ILoggingBuilder??梢岳孟嗉咏Y(jié)果多次調(diào)用 ConfigureLogging。
var host = new HostBuilder().ConfigureLogging((hostContext, configLogging) => { configLogging.AddConsole(); configLogging.AddDebug(); })
6.4.1UseConsoleLifetime
UseConsoleLifetime偵聽Ctrl+C/SIGINT或SIGTERM并調(diào)用StopApplication來啟動(dòng)關(guān)閉進(jìn)程。UseConsoleLifetime解除阻止RunAsync和WaitForShutdownAsync等擴(kuò)展。ConsoleLifetime預(yù)注冊(cè)為默認(rèn)生命周期實(shí)現(xiàn),使用注冊(cè)的最后一個(gè)生命周期。
var host = new HostBuilder().UseConsoleLifetime()
7.容器配置
主機(jī)可以接受IServiceProviderFactory<TContainerBuilder>。提供工廠不屬于DI容器注冊(cè),而是用于創(chuàng)建具體DI容器的主機(jī)內(nèi)部函數(shù)。UseServiceProviderFactory(IServiceProviderFactory<TContainerBuilder>)重寫用于創(chuàng)建應(yīng)用程序的服務(wù)提供程序的默認(rèn)工廠。ConfigureContainer方法托管自定義容器配置。ConfigureContainer提供在基礎(chǔ)主機(jī)API的基礎(chǔ)之上配置容器的強(qiáng)類型體驗(yàn)??梢岳孟嗉咏Y(jié)果多次調(diào)用ConfigureContainer。
為應(yīng)用程序創(chuàng)建服務(wù)容器并提供服務(wù)容器工廠:
public class GenericHostSample { internal class ServiceContainerFactory : IServiceProviderFactory<ServiceContainer> { public ServiceContainer CreateBuilder(IServiceCollection services) { return new ServiceContainer(); } public IServiceProvider CreateServiceProvider(ServiceContainer containerBuilder) { throw new NotImplementedException(); } } }
使用該工廠并為應(yīng)用程序配置自定義服務(wù)容器:
var host = new HostBuilder().UseServiceProviderFactory<ServiceContainer>(new ServiceContainerFactory()) .ConfigureContainer<ServiceContainer>((hostContext, container) =>{ })
8.擴(kuò)展性
在IHostBuilder上使用擴(kuò)展方法實(shí)現(xiàn)主機(jī)擴(kuò)展性。應(yīng)用程序建立UseHostedService擴(kuò)展方法,以注冊(cè)在T中傳遞的托管服務(wù):
public static class Extensions { public static IHostBuilder UseHostedService<T>(this IHostBuilder hostBuilder) where T : class, IHostedService, IDisposable { return hostBuilder.ConfigureServices(services => services.AddHostedService<T>()); } }
9.管理主機(jī)
IHost實(shí)現(xiàn)負(fù)責(zé)啟動(dòng)和停止由服務(wù)容器中注冊(cè)的IHostedService實(shí)現(xiàn)。
9.1Run
Run運(yùn)行應(yīng)用程序并阻止調(diào)用線程,直到關(guān)閉主機(jī):
public class Program { public void Main(string[] args) { var host = new HostBuilder().Build(); host.Run(); } }
9.2RunAsync
RunAsync運(yùn)行應(yīng)用程序并返回在觸發(fā)取消令牌或關(guān)閉時(shí)完成的Task:
public class Program { public static async Task Main(string[] args) { var host = new HostBuilder().Build(); await host.RunAsync(); } }
9.3RunConsoleAsync
RunConsoleAsync啟用控制臺(tái)、生成和啟動(dòng)主機(jī),以及等待Ctrl+C/SIGINT或SIGTERM關(guān)閉。
public class Program { public static async Task Main(string[] args) { var hostBuilder = new HostBuilder(); await hostBuilder.RunConsoleAsync(); } }
9.4Start和StopAsync
Start同步啟動(dòng)主機(jī)。StopAsync嘗試在提供的超時(shí)時(shí)間內(nèi)停止主機(jī)。
public class Program { public static async Task Main(string[] args) { var host = new HostBuilder().Build(); using (host) { host.Start(); await host.StopAsync(TimeSpan.FromSeconds(5)); } } }
9.5StartAsync和StopAsync
StartAsync啟動(dòng)應(yīng)用程序。StopAsync停止應(yīng)用程序。
public class Program { public static async Task Main(string[] args) { var host = new HostBuilder().Build(); using (host) { await host.StartAsync(); await host.StopAsync(); } } }
9.6WaitForShutdown
WaitForShutdown通過IHostLifetime觸發(fā),例如ConsoleLifetime(偵聽Ctrl+C/SIGINT或SIGTERM)。WaitForShutdown調(diào)用StopAsync。
public class Program { public void Main(string[] args) { var host = new HostBuilder().Build(); using (host) { host.Start(); host.WaitForShutdown(); } } }
9.7WaitForShutdownAsync
WaitForShutdownAsync返回在通過給定的令牌和調(diào)用StopAsync來觸發(fā)關(guān)閉時(shí)完成的Task。
public class Program { public static async Task Main(string[] args) { var host = new HostBuilder().Build(); using (host) { await host.StartAsync(); await host.WaitForShutdownAsync(); } } }
9.8External control(外部控件)
public class Program { private IHost _host; public Program() { _host = new HostBuilder() .Build(); } public async Task StartAsync() { _host.StartAsync(); } public async Task StopAsync() { using (_host) { await _host.StopAsync(TimeSpan.FromSeconds(5)); } } }
在StartAsync開始時(shí)調(diào)用WaitForStartAsync,在繼續(xù)之前,會(huì)一直等待該操作完成。它可用于延遲啟動(dòng),直到外部事件發(fā)出信號(hào)。
10.IHostingEnvironment、IApplicationLifetime接口
該兩個(gè)接口類型跟上一篇Web主機(jī)IHostingEnvironment、IApplicationLifetime接口類型是一樣的,詳情就不在這多講了,想要了解的請(qǐng)移步到上一篇Web主機(jī)文章。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
ASP.NET實(shí)現(xiàn)word文檔在線預(yù)覽功能代碼
文檔管理系統(tǒng)需要實(shí)現(xiàn)WORD能在線預(yù)覽功能,以前覺得挺難的,經(jīng)過一番研究發(fā)現(xiàn),WORD自帶的另存為可以保存為HTMl文件。2010-07-07ASP.NET中FileUpload文件上傳控件應(yīng)用實(shí)例
本文主要介紹FileUpload文件上傳控件在實(shí)際開發(fā)中經(jīng)常遇到的問題并給出解決方法,希望對(duì)大家有所幫助。2016-04-04ASP.NET Core應(yīng)用程序配置文件AppSetting.json
這篇文章介紹了ASP.NET Core應(yīng)用程序配置文件AppSetting.json,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-02-02部署ASP.NET?Core程序到Linux系統(tǒng)
這篇文章介紹了部署ASP.NET?Core程序到Linux系統(tǒng)的方法,對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-03-03