ASP.NET Core中的通用主机HostBuilder如何改写为支持长尾词的?

2026-03-30 10:111阅读0评论SEO资讯
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计2006个文字,预计阅读时间需要9分钟。

ASP.NET Core中的通用主机HostBuilder如何改写为支持长尾词的?

目录

1.前言

2.介绍

3.设置主机

ASP.NET Core中的通用主机HostBuilder如何改写为支持长尾词的?

4.选项

4.1 关闭超时值

5.默认服务

6.主机配置

6.1 配置主机配置

6.2 配置应用程序配置

6.3 配置服务

6.4 配置日志记录

6.4.1 使用控制台生命周期

7.容器配置

8.扩展

目录
  • 1.前言
  • 2.介绍
  • 3.设置主机
  • 4.选项
    • 4.1关闭超时值
  • 5.默认服务
    • 6.主机配置
      • 6.1ConfigureHostConfiguration
      • 6.2ConfigureAppConfiguration
      • 6.3ConfigureServices
      • 6.4ConfigureLogging
        • 6.4.1UseConsoleLifetime
    • 7.容器配置
      • 8.扩展性
        • 9.管理主机
          • 9.1Run
            • 9.2RunAsync
              • 9.3RunConsoleAsync
                • 9.4Start和StopAsync
                  • 9.5StartAsync和StopAsync
                    • 9.6WaitForShutdown
                      • 9.7WaitForShutdownAsync
                        • 9.8External control(外部控件)
                        • 10.IHostingEnvironment、IApplicationLifetime接口

                          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<HostOptions>(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<LifetimeEventsHostedService>(); services.AddHostedService<TimedHostedService>(); })

                          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<TContainerBuilder>。提供工厂不属于DI容器注册,而是用于创建具体DI容器的主机内部函数。UseServiceProviderFactory(IServiceProviderFactory<TContainerBuilder>)重写用于创建应用程序的服务提供程序的默认工厂。ConfigureContainer方法托管自定义容器配置。ConfigureContainer提供在基础主机API的基础之上配置容器的强类型体验。可以利用相加结果多次调用ConfigureContainer。

                          为应用程序创建服务容器并提供服务容器工厂:

                          public class GenericHostSample { internal class ServiceContainerFactory : IServiceProviderFactory<ServiceContainer> { public ServiceContainer CreateBuilder(IServiceCollection services) { return new ServiceContainer(); } public IServiceProvider CreateServiceProvider(ServiceContainer containerBuilder) { throw new NotImplementedException(); } } }

                          使用该工厂并为应用程序配置自定义服务容器:

                          var host = new HostBuilder().UseServiceProviderFactory<ServiceContainer>(new ServiceContainerFactory()) .ConfigureContainer<ServiceContainer>((hostContext, container) =>{ })

                          8.扩展性

                          在IHostBuilder上使用扩展方法实现主机扩展性。应用程序建立UseHostedService扩展方法,以注册在T中传递的托管服务:

                          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.管理主机

                          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主机文章。

                          以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自由互联。

                          本文共计2006个文字,预计阅读时间需要9分钟。

                          ASP.NET Core中的通用主机HostBuilder如何改写为支持长尾词的?

                          目录

                          1.前言

                          2.介绍

                          3.设置主机

                          ASP.NET Core中的通用主机HostBuilder如何改写为支持长尾词的?

                          4.选项

                          4.1 关闭超时值

                          5.默认服务

                          6.主机配置

                          6.1 配置主机配置

                          6.2 配置应用程序配置

                          6.3 配置服务

                          6.4 配置日志记录

                          6.4.1 使用控制台生命周期

                          7.容器配置

                          8.扩展

                          目录
                          • 1.前言
                          • 2.介绍
                          • 3.设置主机
                          • 4.选项
                            • 4.1关闭超时值
                          • 5.默认服务
                            • 6.主机配置
                              • 6.1ConfigureHostConfiguration
                              • 6.2ConfigureAppConfiguration
                              • 6.3ConfigureServices
                              • 6.4ConfigureLogging
                                • 6.4.1UseConsoleLifetime
                            • 7.容器配置
                              • 8.扩展性
                                • 9.管理主机
                                  • 9.1Run
                                    • 9.2RunAsync
                                      • 9.3RunConsoleAsync
                                        • 9.4Start和StopAsync
                                          • 9.5StartAsync和StopAsync
                                            • 9.6WaitForShutdown
                                              • 9.7WaitForShutdownAsync
                                                • 9.8External control(外部控件)
                                                • 10.IHostingEnvironment、IApplicationLifetime接口

                                                  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<HostOptions>(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<LifetimeEventsHostedService>(); services.AddHostedService<TimedHostedService>(); })

                                                  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<TContainerBuilder>。提供工厂不属于DI容器注册,而是用于创建具体DI容器的主机内部函数。UseServiceProviderFactory(IServiceProviderFactory<TContainerBuilder>)重写用于创建应用程序的服务提供程序的默认工厂。ConfigureContainer方法托管自定义容器配置。ConfigureContainer提供在基础主机API的基础之上配置容器的强类型体验。可以利用相加结果多次调用ConfigureContainer。

                                                  为应用程序创建服务容器并提供服务容器工厂:

                                                  public class GenericHostSample { internal class ServiceContainerFactory : IServiceProviderFactory<ServiceContainer> { public ServiceContainer CreateBuilder(IServiceCollection services) { return new ServiceContainer(); } public IServiceProvider CreateServiceProvider(ServiceContainer containerBuilder) { throw new NotImplementedException(); } } }

                                                  使用该工厂并为应用程序配置自定义服务容器:

                                                  var host = new HostBuilder().UseServiceProviderFactory<ServiceContainer>(new ServiceContainerFactory()) .ConfigureContainer<ServiceContainer>((hostContext, container) =>{ })

                                                  8.扩展性

                                                  在IHostBuilder上使用扩展方法实现主机扩展性。应用程序建立UseHostedService扩展方法,以注册在T中传递的托管服务:

                                                  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.管理主机

                                                  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主机文章。

                                                  以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持自由互联。