(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<HostOptions>(option =>
{
option.ShutdownTimeout = System.TimeSpan.FromSeconds();
});
})
.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());
}
}
}
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());
}
}
}
在StartAsync开始时调用WaitForStartAsync,在继续之前,会一直等待该操作完成。它可用于延迟启动,直到外部事件发出信号。
10.IHostingEnvironment、IApplicationLifetime接口
该两个接口类型跟上一篇Web主机IHostingEnvironment、IApplicationLifetime接口类型是一样的,详情就不在这多讲了,想要了解的请移步到上一篇Web主机文章。
参考文献:
ASP.NET Core 通用主机
(16)ASP.NET Core 通用主机(HostBuilder)的更多相关文章
- (15)ASP.NET Core Web主机(IWebHostBuilder)
1.前言 ASP.NET Core应用程序可以配置和启动主机(Host).主机负责应用程序启动和生存期管理,配置服务器和请求处理管道.主机还可以设置日志记录.依赖关系注入和配置.而host主机又包括W ...
- Net Core通用主机项目报错 程序不包含适合于入口点的静态Main
Net Core通用主机的介绍: https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/host/generic-host?view=as ...
- .Net Core 通用主机(Core 在控制台应用程序中的应用)
一.介绍 官方文档中说,Microsoft.AspNetCore.App 元包(ASP.NET Core 2.1 或更高版本)包含通用主机的Microsoft.Extensions.Hosting包, ...
- asp.net core 系列 17 通用主机 IHostBuilder
一.概述 ASP.NET Core 通用主机 (HostBuilder),该主机对于托管不处理 HTTP 请求的应用非常有用.通用主机的目标是将 HTTP 管道从 Web 主机 API 中分离出来,从 ...
- 【目录】asp.net core系列篇
随笔分类 - asp.net core系列篇 asp.net core系列 68 Filter管道过滤器 摘要: 一.概述 本篇详细了解一下asp.net core filters,filter叫&q ...
- [翻译] ASP.NET Core 3.0 的新增功能
ASP.NET Core 3.0 的新增功能 全文翻译自微软官方文档英文版 What's new in ASP.NET Core 3.0 本文重点介绍了 ASP.NET Core 3.0 中最重要的更 ...
- 翻译 - ASP.NET Core 基本知识 - 通用主机 (Generic Host)
翻译自 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-5.0 ...
- asp.net core 系列 16 Web主机 IWebHostBuilder
一.概述 在asp.net core中,Host主机负责应用程序启动和生存期管理.host主机包括Web 主机(IWebHostBuilder)和通用主机(IHostBuilder).Web 主机是适 ...
- ASP.NET Core管道深度剖析(4):管道是如何建立起来的?
在<管道是如何处理HTTP请求的?>中,我们对ASP.NET Core的请求处理管道的构成以及它对请求的处理流程进行了详细介绍,接下来我们需要了解的是这样一个管道是如何被构建起来的.这样一 ...
随机推荐
- struts2入门Demo
一.引入必要的jar包,所需jar包如下: 二.配置web.xml.主要目的是拦截请求 <?xml version="1.0" encoding="UTF-8&qu ...
- 如何让使用create-react-app构建的项目在build过程中如何不生成.map文件
避免create-react-app的项目在build的过程中生成 .map 文件的方法:主要是更改 package.json 里面的 build 命令!正式进入修改步骤前,推荐安装 cross-en ...
- C语言学习书籍推荐《明解C语言》下载
柴田望洋 (作者), 管杰 (译者), 罗勇 (译者) <明解C语言>是日本的C语言经典教材,自出版以来不断重印.修订,被誉为“C语言圣经”.作者在日本IT界家喻户晓,出版过一系列极富影响 ...
- RSYNC部署
1 rsync简介 1.1 什么是rsync rsync: - a fast, versatile, remote (and local) file-copying toolrsync:是一种快速,多 ...
- [记录]FIO测试磁盘iops性能
FIO测试磁盘iops性能 1.SATA和SAS盘原生IOPS如下: 2.RAID磁盘阵列对应的写惩罚级别: 3.计算功能性IOPS公式如下: 功能性 IOPS=(((总原生 IOPS×写 %))/( ...
- vs2010 安装项目完成桌面快捷方式无法定位程序文件夹 解决方法
本文转载自http://www.cnblogs.com/jasonxuvip/archive/2012/07/13/2589952.html 软件打包工具有很多种,让人不知道选那个方便自己使用,Tig ...
- 艺赛旗RPA-处理无表头表格
今天写一个demo,要求是对表格数据用价格为key进行排序 样本数据有两种格式: 一.第一行是一个大单元格 处理步骤: 在不变参数的情况下读取表格数据: 结果如下: 可以看见表头: Unnamed: ...
- Python连载24-函数list&read&seek
一. 函数list (1)定义:用打开的文件作为参数,把文件内的每一行内容作为一个元素 (2)格式:list(文件) (3)例子: with open(r"test01.txt", ...
- 从后端到前端之Vue(三)小结以及一颗真实的大树
上一篇写了一下tab,下面整理一下用过的知识点,本想按照官网的文档,整理一下可以更清晰,结果也许是我的方法不对吧,总之更模糊了. 按照官网文档的顺序整理到了表单输入绑定之前,因为之前大致也就只涉及到这 ...
- PHP中的$_GET变量
定义 在 PHP 中,预定义的 $_GET 变量用于收集来自 method="get" 的表单中的值. $_GET 变量 预定义的 $_GET 变量用于收集来自 method=&q ...