认识ASP.NET Core / Host及其配置解析
- 简介
- IHostBuilder 的默认配置
- IHostBuilder 的配置方法
- ConfigureWebHostDefaults() 的作用与默认配置
- IWebHostBuilder 的配置方法
- Startup.cs 中的配置
- 简短总结
零、简介
本文基于 http:// ASP.NET Core 5.0 版本,文章内的扩展方法均为在空模版项目下包含的扩展方法。
CreateHostBuilder(args).Build().Run();
这是 http:// ASP.NET Core 空模版项目 Main 方法里的第一行代码,可以很直观的看到 http:// ASP.NET Core 启动的三个步骤:
- 1、创建一个 HostBuilder。
- 2、执行 IHostBuilder.Build() 方法创建 IHost 对象。
- 3、执行IHost.Run()方法来启动。
一句话总结就是创建 Host,然后运行 Host。这里的 Host 也可称为宿主,它承载了整个 http:// ASP.NET Core 应用程序。所以创建和配置 Host 的过程也就是创建和配置 http:// ASP.NET Core 应用程序的过程。
Host也常翻译为主机,但个人更喜欢翻译为宿主,因为在 http:// ASP.NET 的上下文中, http:// ASP.NET 应用就是依赖并运行在Host内的,所以翻译为宿主更加形象。
Host是封装应用程序资源的对象,为它所承载的应用提供环境和基本的功能,封装的内容主要包括:
- DI容器, 容器相关内容可参考 本文 。
- 日志
- 配置
- IHostedService实现,启动HTTP服务器的实现的服务就是一个IHostedService。(GenericWebHostService)
Host 是由 IHostBuilder.Build() 方法创建的,所以我们通过对 IHostBuilder 的配置来实现对 Host 的配置。下面我们开始一步一步来解析 IHostBulder 的配置过程,
一、IHostBuilder 默认配置
下面的代码就是 CreateHostBuilder(agrs) 方法的内容。
public static IHostBuilder CreateHostBuilder(string[] args)
return Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
webBuilder.UseStartup<Startup>();
Host.CreateDefaultBuilder()
这个方法创建一个类型为 Microsoft.Extensions.Hosting.HostBuilder(实现 IHostBuilder 接口) 的对象,并进行如下的默认设置:
- 设置Host 的 ContentRootPath 为当前目录。
- 载入 DOTNET_ 前缀的环境变量配置。
- 载入命令行参数 agrs 的配置。
- 载入 appsettings.json文件和appsettings.[enviromentName].json文件的配置。
- 当 EnvironmentName 为 Development 时载入 User Secrets。
二、IHostBuilder 的配置方法
在包含了默认配置的对象创建后,开发人员可以使用 HostBuilder 对象来进行更多自定义的配置,主要介绍下面这几个方面。
1.可以替换默认的DI容器实现
Host 使用的默认容器为 Microsoft.Extensions.DependencyInjection.ServiceProvider,你可以使用 IHostBuilder 对象来将 其替换为自定义或第三方的容器,具体内容可参考下面的文档,
该页面也提到了 http:// ASP.NET Core 一些主流的第三方容器。下面以第三方的 Autofac 为例说明如何替换默认的DI容器实现,
public class Program
public static void Main(string[] args)
// ASP.NET Core 3.0+:
// The UseServiceProviderFactory call attaches the
// Autofac provider to the generic hosting mechanism.
var host = Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
......
.Build();
host.Run();
2.服务的配置
在通用主机配置中你可以添加各种服务,包括非HTTP的服务,例如后台运行服务BackgroundService,如下面的代码所示。
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureServices((hostContext, services) =>
services.AddHostedService<Worker>();
3. Host 生命周期事件,IHostApplicationLifetime 服务
通过这个服务开发者可以在Host的各个生命周期事件上挂载对应的处理方法(启动时,停止时,停止后),具体方式如下面的代码所示,
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
// 此处代码在Host启动后执行
private void OnStopping()
_logger.LogInformation("OnStopping has been called.");
// Perform on-stopping activities here
// 此处代码在Host停止动作开始时执行
private void OnStopped()
_logger.LogInformation("OnStopped has been called.");