认识ASP.NET Core / Host及其配置解析

认识ASP.NET Core / Host及其配置解析

  • 简介
  • IHostBuilder 的默认配置
  • IHostBuilder 的配置方法
  • ConfigureWebHostDefaults() 的作用与默认配置
  • IWebHostBuilder 的配置方法
  • Startup.cs 中的配置
  • 简短总结

零、简介

本文基于 ASP.NET Core 5.0 版本,文章内的扩展方法均为在空模版项目下包含的扩展方法。

CreateHostBuilder(args).Build().Run();

这是 ASP.NET Core 空模版项目 Main 方法里的第一行代码,可以很直观的看到 ASP.NET Core 启动的三个步骤:

  • 1、创建一个 HostBuilder。
  • 2、执行 IHostBuilder.Build() 方法创建 IHost 对象。
  • 3、执行IHost.Run()方法来启动。

一句话总结就是创建 Host,然后运行 Host。这里的 Host 也可称为宿主,它承载了整个 ASP.NET Core 应用程序。所以创建和配置 Host 的过程也就是创建和配置 ASP.NET Core 应用程序的过程。

Host也常翻译为主机,但个人更喜欢翻译为宿主,因为在 ASP.NET 的上下文中, 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 对象来将 其替换为自定义或第三方的容器,具体内容可参考下面的文档,

该页面也提到了 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.");