引用https://blog.csdn.net/mss359681091/article/details/1474947001. 主机模型概述

引用https://blog.csdn.net/mss359681091/article/details/147494700

1.1 主机的作用

主机在 ASP.NET Core 中负责:

  • 应用程序的启动和生命周期管理
  • 依赖注入容器的配置
  • 应用程序配置的设置
  • 日志系统的初始化
  • 中间件管道的构建(针对Web应用)

1.2 三种主机的演进

  • WebHost (1.0-3.x):最初的Web应用主机
  • Host (3.0+):通用主机,用于 非HTTP 场景
  • WebApplication (6.0+):现代化 Web应用 主机

1.3 如何选择主机模型

场景 推荐主机
新Web项目 (6.0+) WebApplication
旧Web项目 (3.0-5.0) WebHost (考虑迁移)
后台服务/Worker Host

2. 主要应用

执行顺序

// 输出顺序:
// 环境: Production
// 应用: MyApp
// 1. StartAsync - 服务开始启动
// 2. [主机完全启动]
// 3. ApplicationStarted - 应用已完全启动
// [应用运行中... 按 Ctrl+C]
// 4. ApplicationStopping - 正在关闭应用
// 5. StopAsync - 服务停止中
// 6. ApplicationStopped - 应用已关闭

2.1 设置主机

主机通常由 Program 类中的代码配置、生成和运行。 Main 方法:

using Example.WorkerService;

HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
builder.Services.AddHostedService<Worker>();

IHost host = builder.Build();
host.Run();

IHostApplicationBuilder:主机级配置中心

  • 定位:应用程序主机的「总设计师」,负责初始化环境、加载配置、注册服务
2.1.1. 应用构建器默认配置
Name Description
CreateApplicationBuilder()

Initializes a new instance of the HostApplicationBuilder class with pre-configured defaults.

CreateApplicationBuilder(HostApplicationBuilderSettings)

Initializes a new instance of the HostApplicationBuilder class with preconfigured defaults.

CreateApplicationBuilder(String[])

Initializes a new instance of the HostApplicationBuilder class with pre-configured defaults.

默认配置:

  • 内容根路径设置为由 GetCurrentDirectory() 返回的路径。
  • 从以下位置加载主机配置
    • 前缀为 DOTNET_ 的环境变量。
    • 命令行参数。
  • 从以下位置加载应用程序配置
    • appsettings.json。
    • appsettings.{Environment}.json。
    • 密钥管理器 当应用在 Development 环境中运行时。
    • 环境变量。
    • 命令行参数。
  • 配置 ILoggerFactory 添加以下日志记录提供程序:
    • 控制台
    • 调试
    • 事件源
    • EventLog(仅当在 Windows 上运行时)
  • 当环境为Development时,启用范围验证和依赖验证。
2.1.2 应用构建器自定义配置项

CreateApplicationBuilder(HostApplicationBuilderSettings)

HostApplicationBuilderSettings包含的内容包括:

属性 类型 作用 默认值
ApplicationName string 设置应用程序名称,影响 IHostEnvironment.ApplicationName 自动检测(通常为入口程序集名)
Args string[] 添加命令行参数到配置系统 null
Configuration ConfigurationManager 提供初始配置源,可影响主机行为 null
ContentRootPath string 设置内容根目录路径 Directory.GetCurrentDirectory()
DisableDefaults bool 是否禁用预配置的默认设置 false
EnvironmentName string 设置环境名称(Development/Staging/Production) ASPNETCORE_ENVIRONMENT 或 DOTNET_ENVIRONMENT 环境变量
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Hosting;

var settings = new HostApplicationBuilderSettings
{
    Args = args,
    // 预先配置自定义配置源
    Configuration = new ConfigurationManager()
};

// 添加 JSON 配置文件
settings.Configuration.AddJsonFile("customsettings.json", optional: true, reloadOnChange: true);
// 添加 XML 配置文件
settings.Configuration.AddXmlFile("appsettings.xml", optional: true);
// 添加自定义配置源
settings.Configuration.Add(new MyCustomConfigurationSource());

var builder = Host.CreateApplicationBuilder(settings);

// builder.Configuration 已经包含上述自定义配置
builder.Services.AddHostedService<MyService>();

using var host = builder.Build();
await host.RunAsync();

2.2 框架提供的服务

调用 IHostBuilder.Build() 或 HostApplicationBuilder.Build() 时,自动注册以下服务:

  • IHostApplicationLifetime: 应用程序生命周期,允许在应用程序启动和关闭时执行自定义代码。
public interface IHostApplicationLifetime
{
    CancellationToken ApplicationStarted { get; }   // 应用程序已启动
    CancellationToken ApplicationStopping { get; }  // 应用程序正在停止
    CancellationToken ApplicationStopped { get; }   // 应用程序已停止
    
    void StopApplication();  // 请求停止应用程序
}
  • IHostLifetime:主机生命周期控制,控制主机何时启动和停止,监听系统信号并做出响应。
public interface IHostLifetime
{
    Task WaitForStartAsync(CancellationToken cancellationToken);
    Task StopAsync(CancellationToken cancellationToken);
}
public interface IHostEnvironment
{
    string ApplicationName { get; }      // 应用程序名称
    string EnvironmentName { get; }      // 环境名称(Development/Staging/Production)
    string ContentRootPath { get; }      // 内容根目录路径
    IFileProvider ContentRootFileProvider { get; }  // 内容根目录的文件提供程序
}

如果要针对 Web 进行生成或者要编写分散式应用程序,可能需要使用不同的主机生成器。 请考虑使用以下列表中的其他主机生成器:

2.3 关闭

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐