翻译自 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. C++ string常见函数总结

    基础概念 对照功能列表:不能直接回答的再去看相应解析说明. begin 得到指向字符串开头的 Iterator end 得到指向字符串结尾的 Iterator rbegin 得到指向反向字符串开头的 ...

  2. Docker被替代 PodMan成为程序员新宠

  3. 用python写图片格式批量处理工具

    一.思路分析 其实,照片处理要求很简单,主要是两个方面:一个是调整图片尺寸(即宽x高),另一个是调整图片的大小(即压缩).为了实现这两个功能,利用python中的PIL库即可,其安装方法如下: pip ...

  4. C#反编译工具ILSpy 反汇编

    ILSpy反编译工具之C#反汇编   1.下载ILspy工具 https://github.com/icsharpcode/ILSpy#ilspy------- 注意: ILspy需要在电脑上安装.N ...

  5. java如何实现入职时间到现在 java如何计算知道入职时间, 求工作时长格式为年--月--日。

    Date ruZhi = new Date("入职年月bai"); Date now = new Date(); //算出du来时间夸格zhi多长 long shiChang = ...

  6. 支付业务优化else if 代码

    背景 最近在做项目的时候,需要接入支付.由于接入第三方支付而且还不知止一家,需要接入很多家.比如说支付宝.微信.富友支付等.每家支付都一个回调.现如今的代码,根据不同的第三方支付一大堆else if判 ...

  7. node2vec实现源码详解

    一.按照程序执行的顺序,第一步是walker.py中的preprocess_transition_probs()函数 这个函数的作用是生成两个采样预备数据,alias_nodes,alias_edge ...

  8. mysql基础之double,float长度标度定义

    MySQL类型float double decimal的区别 float数值类型用于表示单精度浮点数值,而double数值类型用于表示双精度浮点数值,float和double都是浮点型,而decima ...

  9. 基于http的netty demo

    1.引入netty的pom <dependency> <groupId>io.netty</groupId> <artifactId>netty-all ...

  10. java nio中,HeapByteBuffer与DirectByteBuffer的区别

    HeapByteBuffer,顾名思义,是写在jvm堆上面的一个buffer,底层的本质是一个数组,用类封装维护了很多的索引(limit/position/capacity等) DirectByteB ...