(16)ASP.NET Core 通用主机(HostBuilder) – Python量化投资

(16)ASP.NET Core 通用主机(HostBuilder)

1.前言 ASP.NET Core应用程序可以配置和启动主机(Host)。主机负责应用程序启动和生命周期管理。通用主机用于无法处理HTTP请求的应用程序。通用主机的用途是将HTTP管道从Web主机API中分离出来,从而启用更多的主机方案。 基于通用主机的消息、后台任务和其他非HTTP工作负载可从横切功能(如配置、依赖关系注入[DI]和日志记录)中受益。通用主机是ASP.NET Core 2.1中的新增功能,不适用于Web承载方案。对于Web承载方案,请使用Web主机。通用主机将在未来版本中替换Web主机,并在HTTP和非HTTP方案中充当主要的主机API。 2.介绍 IHostedService是执行代码的入口点。每个IHostedService实现都按照ConfigureServices中服务注册的顺序执行。主机启动时,每个IHostedService上都会调用StartAsync,主机正常关闭时,以反向注册顺序调用StopAsync。 3.设置主机 IHostBuilder是供库和应用程序初始化、生成和运行主机的主要组件: public static async Task Main( string [] args)
{ var host = new HostBuilder().Build(); await host.RunAsync();
} 4.选项 HostOptions配置IHost的选项。 4.1关闭超时值 ShutdownTimeout设置StopAsync的超时值。默认值为5秒。Program.Main中的以下选项配置将默认值为5秒的关闭超时值增加至20秒: var host = new HostBuilder().ConfigureServices((hostContext, services) => {
services.Configure (option => {
option.ShutdownTimeout = System.TimeSpan.FromSeconds( 20 );
});
})
.Build(); 5.默认服务 在主机初始化期间注册以下服务: ●环境 (IHostingEnvironment) ●HostBuilderContext ●配置 (IConfiguration) ●IApplicationLifetime (ApplicationLifetime) ●IHostLifetime (ConsoleLifetime) ●IHost ●选项 (AddOptions) ●日志记录 (AddLogging) 6.主机配置 主机配置的创建方式如下: ●调用IHostBuilder上的扩展方法以设置“内容根”和“环境”。 ●从ConfigureHostConfiguration中的配置提供应用程序读取配置。 ●应用程序键(名称)、内容根、环境配置方式我就不多说了,跟上一篇Web主机配置是一样的。 6.1ConfigureHostConfiguration ConfigureHostConfiguration使用IConfigurationBuilder来为主机创建IConfiguration。主机配置用于初始化IHostingEnvironment,以供在应用程序的构建过程中使用。可多次调用ConfigureHostConfiguration,并得到累计结果。必须在ConfigureHostConfiguration中显式指定应用程序所需的任何配置提供自身,包括: ●文件配置(例如,来自hostsettings.json文件)。 ●环境变量配置。 ●命令行参数配置。 ●任何其他所需的配置提供程序。 通过使用SetBasePath指定应用程序的基本路径,然后调用其中一个文件配置提供应用程序,可以启用主机的文件配置。示例应用使用JSON文件hostsettings.json,并调用AddJsonFile来使用文件的主机配置设置。要添加主机的环境变量配置,请在主机生成器上调用 AddEnvironmentVariables。AddEnvironmentVariables接受用户定义的前缀(可选)。示例应用程序使用前缀PREFIX_。当系统读取环境变量时,便会删除前缀。配置示例应用程序的主机后,PREFIX_ENVIRONMENT的环境变量值就变成environment密钥的主机配置值。示例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实现上调用ConfigureAppConfiguration创建应用程序配置。ConfigureAppConfiguration使用IConfigurationBuilder来为应用程序创建IConfiguration。可多次调用ConfigureAppConfiguration,并得到累计结果。应用程序使用上一次在一个给定键上设置值的选项。HostBuilderContext.Configuration中提供ConfigureAppConfiguration创建的配置,以供进行后续操作和在Services中使用。应用程序配置会自动接收ConfigureHostConfiguration提供的主机配置。示例应用配置使用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将服务添加到应用程序的依赖关系注入容器。可多次调用ConfigureServices,并得到累计结果。托管服务是一个类,具有实现IHostedService接口的后台任务逻辑。示例应用程序使用AddHostedService扩展方法向自身添加生命周期事件 LifetimeEventsHostedService和定时后台任务TimedHostedService服务: var host = new HostBuilder()
.ConfigureServices((hostContext, services) => { if (hostContext.HostingEnvironment.IsDevelopment())
{ // Development service configuration } else { // Non-development service configuration }
services.AddHostedService ();
services.AddHostedService ();
}) 6.4ConfigureLogging ConfigureLogging添加了一个委托来配置提供的ILoggingBuilder。可以利用相加结果多次调用 ConfigureLogging。 var host = new HostBuilder().ConfigureLogging((hostContext, configLogging) => {
configLogging.AddConsole();
configLogging.AddDebug();
}) 6.4.1UseConsoleLifetime UseConsoleLifetime侦听Ctrl+C/SIGINT或SIGTERM并调用StopApplication来启动关闭进程。UseConsoleLifetime解除阻止RunAsync和WaitForShutdownAsync等扩展。ConsoleLifetime预注册为默认生命周期实现,使用注册的最后一个生命周期。 var host = new HostBuilder().UseConsoleLifetime() 7.容器配置 主机可以接受IServiceProviderFactory。提供工厂不属于DI容器注册,而是用于创建具体DI容器的主机内部函数。UseServiceProviderFactory(IServiceProviderFactory)重写用于创建应用程序的服务提供程序的默认工厂。ConfigureContainer方法托管自定义容器配置。ConfigureContainer提供在基础主机API的基础之上配置容器的强类型体验。可以利用相加结果多次调用ConfigureContainer。 为应用程序创建服务容器并提供服务容器工厂: public class GenericHostSample
{ internal class ServiceContainerFactory : IServiceProviderFactory { public ServiceContainer CreateBuilder(IServiceCollection services)
{ return new ServiceContainer();
} public IServiceProvider CreateServiceProvider(ServiceContainer containerBuilder)
{ throw new NotImplementedException();
}
}
} 使用该工厂并为应用程序配置自定义服务容器: var host = new HostBuilder().UseServiceProviderFactory ( new ServiceContainerFactory())
.ConfigureContainer ((hostContext, container) => {
}) 8.扩展性 在IHostBuilder上使用扩展方法实现主机扩展性。应用程序建立UseHostedService扩展方法,以注册在T中传递的托管服务: public static class Extensions
{ public static IHostBuilder UseHostedService( this IHostBuilder hostBuilder) where T : class , IHostedService, IDisposable
{ return hostBuilder.ConfigureServices(services => services.AddHostedService ());
}
} 9.管理主机 IHost实现负责启动和停止由服务容器中注册的IHostedService实现。 9.1Run Run运行应用程序并阻止调用线程,直到关闭主机: public class Program
{ public void Main( string [] args)
{ var host = new HostBuilder().Build();
host.Run();
}
} 9.2RunAsync RunAsync运行应用程序并返回在触发取消令牌或关闭时完成的Task: public class Program
{ public static async Task Main( string [] args)
{ var host = new HostBuilder().Build(); await host.RunAsync();
}
} 9.3RunConsoleAsync RunConsoleAsync启用控制台、生成和启动主机,以及等待Ctrl+C/SIGINT或SIGTERM关闭。 public class Program
{ public static async Task Main( string [] args)
{ var hostBuilder = new HostBuilder(); await hostBuilder.RunConsoleAsync();
}
} 9.4Start和StopAsync Start同步启动主机。StopAsync尝试在提供的超时时间内停止主机。 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启动应用程序。StopAsync停止应用程序。 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触发,例如ConsoleLifetime(侦听Ctrl+C/SIGINT或SIGTERM)。WaitForShutdown调用StopAsync。 public class Program
{ public void Main( string [] args)
{ var host = new HostBuilder().Build(); using (host)
{
host.Start();
host.WaitForShutdown();
}
}
} 9.7WaitForShutdownAsync WaitForShutdownAsync返回在通过给定的令牌和调用StopAsync来触发关闭时完成的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开始时调用WaitForStartAsync,在继续之前,会一直等待该操作完成。它可用于延迟启动,直到外部事件发出信号。 10.IHostingEnvironment、IApplicationLifetime接口 该两个接口类型跟上一篇Web主机IHostingEnvironment、IApplicationLifetime接口类型是一样的,详情就不在这多讲了,想要了解的请移步到上一篇Web主机文章。 参考文献: ASP.NET Core 通用主机
https://www.cnblogs.com/wzk153/p/11340588.html

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论