当前位置: 首页 > news >正文

(16)ASP.NET Core2.2 通用主机(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<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主机文章。

参考文献:
ASP.NET Core 通用主机https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-9.0&viewFallbackFrom=aspnetcore-2.2#container-configuration

http://www.dtcms.com/a/406551.html

相关文章:

  • .NET Core报错解决【无废话上操作】
  • python+springboot+uniapp基于微信小程序的农村事务管理与交流系统
  • React 进阶优化概念(6 个)——从能写组件到写好组件(下)| 葡萄城技术团队
  • 网站建设后期怎样维护wordpress什么模块
  • 兰州市七里河建设局网站在洪雅网站做企业招聘
  • JDK 简介及核心优点以及各种版本JDK高速下载地址(文末)
  • 妙妙题!!
  • 深圳个性化网站建设公司电话野外美食网站设计欣赏
  • React 基础核心概念(8 个)——从入门到能写业务组件(上)| 葡萄城技术团队
  • 在ARM64 Ubuntu 20.04上部署Mailu邮件系统:深度排查Docker Bridge网络通信失败问题
  • 三好街做网站的淘宝客怎么做网站管理
  • 将文件从魅族手机传输到电脑或新设备
  • 静默光伏板背后的毫秒战争:智能运维软件
  • node.js做网站开发网页制作平台排行榜
  • 3、用户认证与鉴权应该放在哪里进行?
  • iOS 混淆与 App Store 审核兼容性 避免被拒的策略与实战流程(iOS 混淆、ipa 加固、上架合规)
  • 界面设计最好的网站举例网站联盟
  • 无服务器 AI 应用:Lambda + SageMaker Endpoint 实时预测服务(技术深度版)
  • 装修公司 网站模板深圳工作服制作
  • React学习教程,从入门到精通,React 单元测试:语法知识点及使用方法详解(30)
  • Wouter 和 React Router的区别
  • 关于如何让 Vosk 正确识别中文音频,核心是 使用 Vosk 中文模型 + 确保中文音频格式符合要求
  • MySQL和PostgreSQL的数据库主键索引都是B+树吗?
  • VUE、jquery、React、Ant Design、element ui、bootstrap 前端框架的 功能总结,示例演示、使用场景介绍、完整对比总结
  • PDF格式转换、PDF编辑全功能解锁,功能图文教程
  • C++项目:仿muduo库高并发服务器
  • 建设网站业务不好做请问那个网站做推广好点
  • Pytest+requests进行接口自动化测试6.0(Jenkins)
  • elasticsearch安装插件
  • html5移动网站开发html5新增标签