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

ASP.NET Core 模板创建了一个 .NET Core 通用主机 (Generic Host HostBuilder)。

本话题提供了关于在 ASP.NET Core 中使用 .NET 通用主机。关于在控制台中使用 .NET Generic Host 的信息,查看 .NET Generic Host

主机定义

主机是指封装了应用程序资源的对象,例如:

  • 依赖注入(DI)
  • 日志
  • 配置
  • IHostedService 实现

当一个主机启动的时候,它会调用 IHostedService.StartAsync 在每一个在服务容器中托管服务集合中注册的 IHostedService 的实现。 在 Web 应用程序中,一个 IHostedService 的实现是一个启动 HTTP server implementation 的 web 服务。

包含所有的应用程序相互依赖的资源在一个对象中的主要原因是声明周期管理:控制应用程序启动和优雅的关闭。

设置一个主机

主机一般在 Program 类中通过代码配置,创建,运行。Main 方法:

  • 调用 CreateHostBuilder 方法创建和配置一个 builder 对象
  • 在 builder 对象上调用 Build 和 Run 方法

ASP.NET Core web 模板生成下列代码创建一个主机:

public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
} public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});
}

下面的代码创建一个 non-HTTP 工作负载,将一个 IHostedService 实现添加到 DI 容器中。

public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
} public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
services.AddHostedService<Worker>();
});
}

对于 HTTP 负载来说,Main 方法是相同的,但是 CreateHostBuilder 调用了 ConfigureWebHostDefaults:

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
});

如果应用程序使用了 Entity Framework Core,不要改变 CreateHostBuiler 方法的名称和签名。Entity Framework Core tools 期望发现一个 CreateHostBuilder 方法,不用运行应用程序就可以配置主机(Host)。更多信息,查看 Design-time DbContext Creation

默认 builder 设置

CreateDefaultBuilder 方法:

  • 设置内容根目录(content root)为 GetCurrentDirectory 返回的路径
  • 从以下地方加载主机配置:
    前缀为 DOTNET_  的环境变量
    命令行参数
  • 从以下地方加载应用程序配置:
    appsettings.json
    appsettings.{Environment}.json
    当应用程序运行在 Development 环境时使用 User secrets环境变量
    命令行参数
  • 添加以下日志(logging)providers:
    控制台
    调试
    EventSource
    EventLog (只有运行在 Windows 系统时)
  • 当环境是 Development 时使能 scope validation 和 dependency validation

ConfigureWebHostDefaults 方法:

文章中下面的 Settings for all app types 和 Settings for web apps 部分展示了如果覆盖默认 builder 设置。

Framework-provided services

下面的服务会自动注册:

更多关于 framework-provided services 的信息,查看 Dependency injection in ASP.NET Core

IHostApplicationLifetime

注入  IHostApplicationLifetime (之前叫做 IApplicationLifetime) 服务到任一类中处理 post-startup 和 优雅关闭的任务。接口中的三个属性是用来注册应用程序启动和停止时间处理方法的取消令牌。接口还包括一个 StopApplication 方法。

下面的示例是接口 IHostedService 的一个实现,注册 IHostApplicationLifetime 事件:

internal class LifetimeEventsHostedService : IHostedService
{
private readonly ILogger _logger;
private readonly IHostApplicationLifetime _appLifetime; public LifetimeEventsHostedService(
ILogger<LifetimeEventsHostedService> logger,
IHostApplicationLifetime appLifetime)
{
_logger = logger;
_appLifetime = appLifetime;
} public Task StartAsync(CancellationToken cancellationToken)
{
_appLifetime.ApplicationStarted.Register(OnStarted);
_appLifetime.ApplicationStopping.Register(OnStopping);
_appLifetime.ApplicationStopped.Register(OnStopped); return Task.CompletedTask;
} public Task StopAsync(CancellationToken cancellationToken)
{
return Task.CompletedTask;
} private void OnStarted()
{
_logger.LogInformation("OnStarted has been called."); // Perform post-startup activities here
} private void OnStopping()
{
_logger.LogInformation("OnStopping has been called."); // Perform on-stopping activities here
} private void OnStopped()
{
_logger.LogInformation("OnStopped has been called."); // Perform post-stopped activities here
}
}

IHostLifetime

IHostLifetime 实现控制主机什么时候启动和什么时候停止。最后一个注册的实现会被使用。

Microsoft.Extensions.Hosting.Internal.ConsoleLifetime 是 IHostLifetime 的默认实现。

ConsoleLifetime:

IHostEnvironment

注入服务 IHostEnvironment 到类中获取关于下列设置的信息:

Web 应用程序实现了 IWebHostEnvironment 接口,它继承了 IHostEnvironment 并添加了 WebRootPath

Host 配置

Host 配置用于 IHostEnvironment 实现的属性。

Host 配置使用 ConfigureAppConfiguration 中的 HostBuilderContext.Configuration。在 ConfigureAppConfiguration 之后,使用应用程序配置替换 HostBuilderContext.Configuration。

为了添加主机配置,调用接口 IHostBuilder 上的 ConfigureHostConfiguration 方法。ConfigureHostConfiguration 可以被多次调用生成累积的结果。主机使用在给定键值最后设置值的选项。

前缀为 DOTNET_ 的环境变量和命令行参数包含在 CreateDefaultBuilder 中。对于 web 应用程序,前缀为 ASPNETCORE_ 的环境变量被添加。当环境变量被读取的时候,前缀会被移除。例如,环境变量 ASPNETCORE_ENVIRONMENT 的值会成为主机配置中 environment 键的值。

下面的示例创建了主机配置:

// using Microsoft.Extensions.Configuration;

Host.CreateDefaultBuilder(args)
.ConfigureHostConfiguration(configHost =>
{
configHost.SetBasePath(Directory.GetCurrentDirectory());
configHost.AddJsonFile("hostsettings.json", optional: true);
configHost.AddEnvironmentVariables(prefix: "PREFIX_");
configHost.AddCommandLine(args);
});

App 配置

App 配置通过调用 IHostBuilder 接口的 ConfigureAppConfiguration 方法创建。ConfigureAppConfiguration 可以多次调用生成累积的结果。App 使用在给定键上最后一个设置值得选项。

创建配置的 ConfigureAppConfiguration 在 HostBuilderContext.Configuration 中,用于后续操作,它作为一个服务从依赖注入 (DI) 中获取。主机配置也会被添加到 App 配置中。

更多信息查看 Configuration in ASP.NET Core

所有应用程序类型的配置

这部分列出的主机配置会被应用到 HTTP 和 non-HTTP 工作负载中。默认的用来配置这些设置的环境变量可以有一个 DOTNET_  或者 ASPNETCORE_ 的前缀。更多信息查看 Default builder settings 部分。

ApplicationName

IHostEnvironment.ApplicationName 属性在主机构造方法中通过 host 配置设置。

Key: applicationName

Type: string

Default: 包含应用程序入口点的程序集的名称

Environment variable: <PREFIX_>APPLICATIONNAME

ContentRoot

IHostEnvironment.ContentRootPath 属性决定主机从哪里开始搜索内容文件。如果路径不存在,主机启动失败。

Key: contentRoot

Type: string

Default: 应用程序程序集所在的目录

Environment variable: <PREFIX_>CONTENTROOT

为了设置这个值,使用环境变量或者调用 IHostBuilder 接口的 UseContentRoot 方法:

Host.CreateDefaultBuilder(args)
.UseContentRoot("c:\\content-root")
//...

更多信息查看:

EnvironmentName

IHostEnvironment.EnvironmentName 属性可以被设置为任意值。框架本身定义的值包括 Development,Staging,和 Production。值不区分大小写。

Key: environment

Type: string

Default: Production

Environment variable: <PREFIX_>ENVIRONMENT

使用 IHostBuilder 接口的 UseEnvironment 方法设置这个值:

Host.CreateDefaultBuilder(args)
.UseEnvironment("Development")
//...

ShutdownTimeout

HostOptions.ShutdownTimeout 为 StopAsync 设置超时时间。默认值是 5 秒。在超时时间内,主机会:

如果超时时间在所有托管服务停止之前过期了,任何任然活动的服务都会在应用程序关闭的时候停止。即使它们没有完成处理,服务也会停止。如果服务需要更多的时间去停止,请增加超时时间。

Key: shutdownTimeoutSeconds

Type: int

Default: 5 second

Environment variable: <PREFIX_>SHUTDOWNTIMEOUTSECONDS

使用环境变量或者配置 HostOptions 设置这个值。下面的例子设置了超时时间为 20 秒:

Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
{
services.Configure<HostOptions>(option =>
{
option.ShutdownTimeout = System.TimeSpan.FromSeconds(20);
});
});

禁用配置改变时重新加载应用程序配置

默认的,appsetting.json 和 appsetting.{Environment}.json 文件改变时会被重新加载。在 ASP.NET Core 5.0 或者更新的版本中可以设置 hostBuilder:reloadConfigOnChange 键值为 false 来禁用重新加载的行为。

Key: hostBuilder:reloadCofigOnChange

Type: bool(true or 1)

Default: true

Command-line argument: hostBuilder:reloadConfigOnChange

Environment variable: <PREFIX_>hostBuilder:reloadConfigureOnChange

️   警告

冒号 (:) 分隔符在所有平台分层键值上的环境变量是不工作的。更多信息查看 Environment variables

Web 应用程序设置

一些主机设置会应用到 HTTP 工作负载中。默认的,用来配置这些设置的环境变量会有 DOTNET_  或者 ASPNETCORE_ 前缀。

可以使用 IWebHostBuilder 的扩展方法设置这些配置。例如下面的示例,代码展示了如果调用扩展方法,假设webBuilder 是 IWebHostBuilder 的实例对象:

public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.CaptureStartupErrors(true);
webBuilder.UseStartup<Startup>();
});

CaptureStartupErrors

当设置为 false 的时候,在启动过程中出现的错误会导致主机退出。当设置为 true 的时候,主机会在启动过程中捕获异常并且试图启动服务器。

Key: captureStartupErrors

Type: bool (true 或者 1)

Default: 默认是 false,除非应用程序使用 Kestrle 运行在 IIS 之后,这时默认值是 true

Environment variable: <PREFIX_>CAPTURESTARTUPERRORS

使用配置或者调用 CaptureStartupErros 设置该值:

webBuilder.CaptureStartupErrors(true);

DetailedErrors

当使能的时候,或者 environment 环境变量是 Development 的时候,应用程序会捕捉详细错误信息。

Key: detailedErrors

Type: bool (true 或者 1)

Default: false

Environment variable: <PREFIXE_>_DETAILEDERRORS

使用配置或者调用 UseSetting 设置该值:

webBuilder.UseSetting(WebHostDefaults.DetailedErrorsKey, "true");

HostingStartupAssemblies

是一个启动时加载的托管的启动程序集的以逗号分隔的字符串。尽管默认配置值是一个空的字符串,托管启动程序集总是包含应用程序的程序集。当托管启动程序集被提供,它们在应用程序启动时创建公共服务的过程中会被添加到应用程序的程序集中加载。

Key: hostingStartupAssemblies

Type: string

Default: Empty string

Environment variable: <PREFIX_>_HOSTINGSTARTUPASSEMBLIES

使用配置或者调用 UseSetting 设置该值:

webBuilder.UseSetting(WebHostDefaults.HostingStartupAssembliesKey, "assembly1;assembly2");

HostingStartupExcludeAssemblies

启动时排除的托管启动程序集,以逗号分隔的字符串

Key: hostingStartupExcludeAssemblies

Type: string

Default: Empty string

Environment variable: <PREFIX_>_HOSTINGSTARTUPEXCLUDEASSEMBLIES

使用配置或者调用 UseSetting 设置该值:

webBuilder.UseSetting(WebHostDefaults.HostingStartupExcludeAssembliesKey, "assembly1;assembly2");

HTTPS_Port

HTTPS 重定向端口。在 enforcing HTTPS 中使用。

Key: https_port

Type: string

Default: A default value isn't set

Environment variable: <PREFIX_>HTTPS_PORT

使用配置或者调用 UseSetting 设置该值:

webBuilder.UseSetting("https_port", "8080");

PreferHostingUrls

标识主机是否应该监听 IWebHostBuilder 配置的 URLs 而不是使用 IServer 的实现配置的 URLs。

Key: preferHostingUrls

Type: bool (true 或者 1)

Default: true

Environment varibale: <PREFIX_>PREFERHOSTINGURLS

使用环境变量或者调用 PreferHostingUrls 设置该值:

webBuilder.PreferHostingUrls(false);

PreventHostingStartup

阻止托管启动程序集的自动加载,包含应用程序程序集配置的托管启动程序集。更多信息查看 Use hosting startup assemblies in ASP.NET Core

Key: preventHostingStartup

Type:bool (true 或者 1)

Default: false

Environment variable: <PREFIX_>PREVENTHOSTINGSTARTUP

使用环境变量或者调用 UseSetting 设置这个值:

webBuilder.UseSetting(WebHostDefaults.PreventHostingStartupKey, "true");

StartupAssembly

用来查询 Startup 类的程序集。

Key: startupAssembly

Type: string

Default: 应用程序程序集

Environment variable: <PREFIX_>STARTUPASSEMBLY

使用环境变量或者调用 UseStartup 设置这个值。UseStartup 可以接收一个程序集的名称(string)或者一个类型 (TStartup)。如果多个 UseStartup 方法被调用,最后一个优先级最高:

webBuilder.UseStartup("StartupAssemblyName");
webBuilder.UseStartup<Startup>();

URLs

一组逗号分隔的带有端口和协议的 IP 地址或者主机地址,服务器应该在这些地址上监听请求。例如,http://localhost:123。使用 "*" 来表明服务器应该在使用特定端口和协议(例如,http://*:5000)的任意 IP 地址或者主机名称上监听。协议(http:// 或者 https://)必须包含在每一个 URL 中。支持的格式因服务器而异。

Key: urls

Type: string

Default: http://localhost:5000 和 https://localhost:5001

Environment variable: <PREFIX_>URLS

使用环境变量或者调用 UseUrls 设置这个值:

webBuilder.UseUrls("http://*:5000;http://localhost:5001;https://hostname:5002");

Kestrel 有它自己的 enpoint 配置 API。更多信息查看 Configure endpoints for the ASP.NET Core Kestrel web server

WebRoot

IWebHostEnvironment.WebRootPath 属性决定了应用程序静态资源的相对路径。如果路径不存在,一个 no-op 的文件被使用。

Key: webroot

Type: string

Default: 默认是 wwwroot。路径{content root}/wwwroot 必须存在

Environment variable: <PREFIX_>WEBROOT

使用环境变量或者 IWebHostBuilder 接口的 UseWebRoot 方法设置这个值:

webBuilder.UseWebRoot("public");

更多信息查看:

管理主机生命周期

调用 IHost 的实现方法启动和停止应用程序。这些方法会影响所有注册在服务容器中的 IHostedService 的实现。

Run

Run 运行应用程序,阻塞调用线程直到主机关闭。

RunAsync

RunAsync 运行应用程序,当一个取消令牌或者关闭被触发的时候返回一个完成 Task

RunConsoleAsync

RunConsoleAsync 使能控制台支持,创建,启动主机,等待 Ctrl + C / SIGINT 或者 SIGTERM 关闭。

Start

Start 以同步方式启动主机

StartAsync

StartAsync 启动主机,当取消令牌或者关闭被触发了,会返回一个完成的 Task

WaitForStartAsync 在 StartAsync 的开始会被调用,继续运行之前会一直等待它完成。这可以用来延迟启动,直到接收到外部事件的通知。

StopAsync

StopAsync 尝试使用提供的超时时间停止主机

WaitForShutdown

WaitForShutdown 阻塞调用线程直到生命周期 IHostLifttime 的关闭被触发,例如通过 Ctrl + C / SIGINT  或者 SIGTERM。

WaitForShutdownAsync

WaitForShutdownAsync 在通过给定的令牌或者调用 StopAsync 触发关闭的时候回返回一个完成的 Task

External 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));
}
}
}

翻译 - ASP.NET Core 基本知识 - 通用主机 (Generic Host)的更多相关文章

  1. 翻译 - ASP.NET Core 基本知识 - Web 主机 (Web Host)

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

  2. asp.net core 3.x 通用主机原理及使用

    一.前言 只是讲asp.net core 3.x通用主机的大致原理,这些东西是通过查看源码以及自己根据经验总结得来的,在文章中不会深入源码,因为个人觉得懂原理就晓得扩展点,后期碰到有需求的时候再仔细去 ...

  3. asp.net core 3.x 通用主机是如何承载asp.net core的-上

    一.前言 上一篇<asp.net core 3.x 通用主机原理及使用>扯了下3.x中的通用主机,刚好有哥们写了篇<.NET Core 3.1和WorkerServices构建Win ...

  4. 翻译 - ASP.NET Core 基本知识 - 配置(Configuration)

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

  5. Asp.net Core 2.1新功能Generic Host(通用主机),了解一下

    什么是Generic Host ? 这是在Asp.Net Core 2.1加入了一种新的Host,现在2.1版本的Asp.Net Core中,有了两种可用的Host. Web Host –适用于托管W ...

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

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

  7. 翻译 - ASP.NET Core 基本知识 - 中间件(Middleware)

    翻译自 https://docs.microsoft.com/en-us/aspnet/core/fundamentals/middleware/?view=aspnetcore-5.0 中间件是集成 ...

  8. ASP.NET Core 基础知识(三) Program.cs类

    ASP.NET Framework应用程序是严重依赖于IIS的,System.Web 中有很多方法都是直接调用的 IIS API,并且它还是驻留在IIS进程中的.而 ASP.NET Core 的运行则 ...

  9. net Core 2.1新功能Generic Host(通用主机)

    net Core 2.1新功能Generic Host(通用主机) http://doc.okbase.net/CoderAyu/archive/301859.html 什么是Generic Host ...

随机推荐

  1. 移动端SCSS

    一.什么是SASS SASS是一种强化CSS的辅助工具,提供了许多便利的写法,大大节省了设计者的时间,使得CSS的开发,变得简单可维护. #二.安装和使用(VS Code中) #1.安装 下载扩展文件 ...

  2. [打基础]luogu1957口算练习题——字符串基本操作

    题意:第一行给出数据组数n,之后n行每行给出三个或两个数据,若给三个数据,则第一个数据用单个字符a/b/c分别表示+/-/*运算,后两个数表示参与运算的数字,若给两个数据延续之前的运算 要求对每行数据 ...

  3. Flink批处理读取Hive写入MySql

    把hive 表stu77 的数据写入 mysql 表test_stu 中. 中间可以加自己的逻辑. import org.apache.flink.table.api.EnvironmentSetti ...

  4. SpringBoot从入门到精通教程(五)

    上节,我们讲了 SpringBoot 如何使用MyBatis 今天我们讲讲 Springboot Logo自定义的问题, 我们在启动 SpringBoot 时,控制台会打印 SpringBoot Lo ...

  5. (已解决)'ng' 不是内部或外部命令,也不是可运行的程序或批处理文件

    前言: 之前在安装Angular环境的时候有个问题,就是通过命令成功安装了angular cli脚手架工具,但是在终端(win+r cmd)中输入ng version一直提示的是'ng' 不是内部或外 ...

  6. 神奇的 SQL 之 HAVING → 容易被轻视的主角

    开心一刻 一天,楼主和隔壁小男孩一起坐电梯,中途进来一位高挑的美女,她牵着一条雪白的贵宾犬 小男孩看着这条雪白的贵宾犬,甚是喜欢,说道:阿姨,我能摸下这个狗狗吗? 美女:叫姐姐 小男孩低头看了下贵宾犬 ...

  7. 老吕教程--02后端KOA2框架自动重启编译服务(nodemon)

    上一篇讲完搭建Typescritp版的Koa框架后,F5运行服务端,页面进行正常显示服务. 今天要分享的是,如果要修改服务端代码,如果让编译服务自动重启,免去手动结束服务再重启的过程. 自动重启服务需 ...

  8. APK 的前世今生:从 Android 源码到 apk 的编译打包流程

    最近想要研究热修复的原理,并自己实现一套简单的热修复框架(音视频的坑刚挖好就又挖另一个坑了2333),已经在看书入门 c++,方便后续查看业内一些知名热修复框架的源码,另外在涉及编译期/运行时修改代码 ...

  9. java中自定义一个异常类 在某些情况抛出自定的异常 ----------阻断程序

    //=============定义异常类 package org.springblade.flow.engine.errorException; /** * 自定义异常处理写入sap失败 */ pub ...

  10. react脚手架抽离webpack报错解决

    我们在写react项目的时候,可能原有的webpack配置不满足我们的需求,需要自己去配置,可是你在创建脚手架的时候并不能在外部找到webpack文件,脚手架的webpack文件在node_modul ...