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)的更多相关文章

  1. (15)ASP.NET Core Web主机(IWebHostBuilder)

    1.前言 ASP.NET Core应用程序可以配置和启动主机(Host).主机负责应用程序启动和生存期管理,配置服务器和请求处理管道.主机还可以设置日志记录.依赖关系注入和配置.而host主机又包括W ...

  2. Net Core通用主机项目报错 程序不包含适合于入口点的静态Main

    Net Core通用主机的介绍: https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/host/generic-host?view=as ...

  3. .Net Core 通用主机(Core 在控制台应用程序中的应用)

    一.介绍 官方文档中说,Microsoft.AspNetCore.App 元包(ASP.NET Core 2.1 或更高版本)包含通用主机的Microsoft.Extensions.Hosting包, ...

  4. asp.net core 系列 17 通用主机 IHostBuilder

    一.概述 ASP.NET Core 通用主机 (HostBuilder),该主机对于托管不处理 HTTP 请求的应用非常有用.通用主机的目标是将 HTTP 管道从 Web 主机 API 中分离出来,从 ...

  5. 【目录】asp.net core系列篇

    随笔分类 - asp.net core系列篇 asp.net core系列 68 Filter管道过滤器 摘要: 一.概述 本篇详细了解一下asp.net core filters,filter叫&q ...

  6. [翻译] ASP.NET Core 3.0 的新增功能

    ASP.NET Core 3.0 的新增功能 全文翻译自微软官方文档英文版 What's new in ASP.NET Core 3.0 本文重点介绍了 ASP.NET Core 3.0 中最重要的更 ...

  7. 翻译 - ASP.NET Core 基本知识 - 通用主机 (Generic Host)

    翻译自 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-5.0 ...

  8. asp.net core 系列 16 Web主机 IWebHostBuilder

    一.概述 在asp.net core中,Host主机负责应用程序启动和生存期管理.host主机包括Web 主机(IWebHostBuilder)和通用主机(IHostBuilder).Web 主机是适 ...

  9. ASP.NET Core管道深度剖析(4):管道是如何建立起来的?

    在<管道是如何处理HTTP请求的?>中,我们对ASP.NET Core的请求处理管道的构成以及它对请求的处理流程进行了详细介绍,接下来我们需要了解的是这样一个管道是如何被构建起来的.这样一 ...

随机推荐

  1. scrapy基础知识之将item写入JSON文件:

    pipelines.py import json class xxPipeline(object):     def __init__(self):         self.filename=ope ...

  2. 你懂什么叫js继承吗

    说到继承呢?肯定有很多做java的朋友都觉得是一个比较简单的东西了.毕竟面向对象的三大特征就是:封装.继承和多态嘛.但是真正对于一个javascript开发人员来说,很多时候其实你使用了继承,但其实你 ...

  3. 学习springboot整合mybatis并编写测试类

    报名立减200元.暑假直降6888. 邀请链接:http://www.jnshu.com/login/1/20535344 邀请码:20535344 遇到的问题: 1.原因是在启动类上只有一个@Map ...

  4. c++小游戏——杀手

    杀手小游戏 会有一个存活者:(1 2 3 4 5),如果出现(1 0 3 4 5),代表二号已经死了. 一号有3次复活权 且有一次随机诅咒权(即当自己被杀死时,会随机诅咒另外一个人,当然不是死人或自己 ...

  5. 关键字static、final

    final final能修饰类.修饰方法.能修饰属性. 修饰类:该类不能被继承. 修饰方法:该方法不能被重写.所以abstract和final不能同时用 修饰属性/变量:该属性/变量为常量,该值不能再 ...

  6. vscode如何将less编译到指定css目录中

    首先使用vscode的搬砖猿,想要在vscode编辑器里面很方便的编译less文件,需要在扩展商店里面下载一款名叫Esay LESS的超好用扩展(我自己都不信),哈哈,其实还好. 安装完扩展之后,最好 ...

  7. sql注入篇1

    一.前言 学习了感觉很久的渗透,总结一下sql注入,系统整理一下sql注入思路. 二.关于sql注入 所谓SQL注入,就是通过把SQL命令插入到Web表单提交或输入域名或页面请求的查询字符串,最终达到 ...

  8. 【MySQL】(五)索引与算法

    本篇文章的主旨是对InnoDB存储引擎支持的索引做一个概述,并对索引内部的机制做一个深入的解析,通过了解索引内部构造来了解哪里可以使用索引. 1.InnoDB存储引擎支持以下几种常见的索引: B+树索 ...

  9. fuel 9.0完全离线配置+升级fule 9.1+bootstrap制作

    2017-08-23 fuel 完全离线配置 完全离线适用于部署在内网,无Internet的环境当中,且需要升级fuel版本的情况.理论上,我的办法适用所有版本. 以下所有操作全部在fuel节点上. ...

  10. 动态规划_Apple Catching_POJ-2385

    It and ) in his field, each full of apples. Bessie cannot reach the apples when they are on the tree ...