跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
C#

ASP.NET Core 主机模型详解:Host、WebHost 与 WebApplication 对比与实践

深入解析了 ASP.NET Core 中的三种主机模型:WebHost、Host 和 WebApplication。WebHost 适用于早期版本但已弃用,Host 用于非 HTTP 场景,而 WebApplication 是 6.0+ 推荐的现代方式。文章通过代码示例对比了它们的用法,提供了从旧模型迁移到新模型的最佳实践,并解答了常见疑问,建议新项目优先采用 WebApplication 模型。

橘子海发布于 2026/4/5更新于 2026/7/2447 浏览
ASP.NET Core 主机模型详解:Host、WebHost 与 WebApplication 对比与实践

前言

在 ASP.NET Core 开发中,主机(Host)是应用程序的入口和运行环境。随着版本的迭代,ASP.NET Core 提供了不同的主机模型,包括 Host、WebHost 和 WebApplication。许多开发者对这些概念容易混淆,本文将深入解析它们的区别,并通过实际代码演示各自的用法。

一、主机模型概述

1.1 主机的作用

主机在 ASP.NET Core 中负责:

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

1.2 三种主机的演进

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

二、三种主机的详细对比

2.1 WebHost (传统 Web 主机)

public class Program
{
    public static void Main(string[] args)
    {
        CreateWebHostBuilder(args).Build().Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .ConfigureAppConfiguration((hostingContext, config) => { /* 配置设置 */ })
            .ConfigureLogging(logging => { /* 日志配置 */ })
            .UseStartup<Startup>();
}

关键点:

  • 使用 WebHost.CreateDefaultBuilder 创建
  • 需要 Startup 类分离配置
  • 在 ASP.NET Core 3.0+ 中已过时

2.2 Host (通用主机)

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

public class Worker : BackgroundService
{
    protected override async Task ExecuteAsync(CancellationToken stoppingToken)
    {
        // 后台服务逻辑
    }
}

关键点:

  • 使用 Host.CreateDefaultBuilder 创建
  • 适合后台服务、控制台应用等非 HTTP 场景
  • 不包含 Web 服务器

2.3 WebApplication (现代 Web 主机)

var builder = WebApplication.CreateBuilder(args);
// 添加服务到容器
builder.Services.AddControllers();
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();

var app = builder.Build();
// 配置 HTTP 请求管道
if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
    app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();

关键点:

  • 使用 WebApplication.CreateBuilder 创建
  • 更简洁的 API 设计
  • 支持最小 API
  • 推荐用于 ASP.NET Core 6.0+ 的新项目

三、最佳实践与迁移建议

3.1 如何选择主机模型

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

3.2 从 WebHost 迁移到 WebApplication

旧代码 (WebHost):

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();
    }

    public void Configure(IApplicationBuilder app)
    {
        app.UseRouting();
        app.UseEndpoints(endpoints => endpoints.MapControllers());
    }
}

新代码 (WebApplication):

var builder = WebApplication.CreateBuilder(args);
builder.Services.AddControllers();
var app = builder.Build();
app.MapControllers();
app.Run();

3.3 最小 API 示例

var builder = WebApplication.CreateBuilder(args);
var app = builder.Build();
app.MapGet("/", () => "Hello World!");
app.MapGet("/user/{id}", (int id) => $"User ID: {id}");
app.Run();

四、常见问题解答

Q1:WebApplication 和 Host 能否共存?

A:可以,WebApplication 内部实际上使用了 Host 作为基础,并添加了 Web 特定功能。

Q2:何时需要使用单独的 Startup 类?

A:在 WebApplication 模型中,Startup 类不再是必需的,所有配置可以在 Program.cs 中完成。但大型项目仍可分离配置。

Q3:性能上有差异吗?

A:WebApplication 启动更快,因为减少了间接层,但运行时性能差异不大。

结语

理解 ASP.NET Core 的不同主机模型对于构建高效应用程序至关重要。随着.NET 的演进,WebApplication 已成为最简单、最直接的 Web 应用构建方式。建议新项目直接采用 WebApplication 模型,现有项目可考虑逐步迁移。

目录

  1. 前言
  2. 一、主机模型概述
  3. 1.1 主机的作用
  4. 1.2 三种主机的演进
  5. 二、三种主机的详细对比
  6. 2.1 WebHost (传统 Web 主机)
  7. 2.2 Host (通用主机)
  8. 2.3 WebApplication (现代 Web 主机)
  9. 三、最佳实践与迁移建议
  10. 3.1 如何选择主机模型
  11. 3.2 从 WebHost 迁移到 WebApplication
  12. 3.3 最小 API 示例
  13. 四、常见问题解答
  14. Q1:WebApplication 和 Host 能否共存?
  15. Q2:何时需要使用单独的 Startup 类?
  16. Q3:性能上有差异吗?
  17. 结语
  • 免费图片AI生成工具免费生成了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
  • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
  • 100+免费在线小游戏爽一把
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • PingFangSC 字体跨平台 Web 解决方案:6 种字重全兼容
  • AI 时代产品经理:厘清 AI 能力边界与技术限制
  • Ubuntu 20.04 安装 Ollama 及 Open WebUI 部署 LLM 指南
  • llama.cpp 量化模型部署实战:从模型转换到 API 服务
  • HDFS EC 基础:Vandermonde 范德蒙德矩阵原理
  • 无人机智能巡检系统与大疆云端 API 集成实践
  • C++ 共享内存原理及 Windows 实现
  • GitHub Copilot 兼容 OpenAI/Anthropic API 的代理工具 copilot-api
  • OpenClaw 对接飞书机器人高频踩坑与解决方案
  • 直流无刷电机 FOC 控制算法原理与 STM32 实战
  • C++ 线程池核心原理与代码实现
  • MetaLlama 大模型系列介绍与本地部署指南
  • OpenAI 集成 LangChain 使用详解
  • AG-UI:构建 AI 前端交互的统一协议
  • C++ 类和对象:默认成员函数详解
  • WorkBuddy 接入 QQ 机器人配置指南
  • 网络安全专业术语详解
  • 使用 rrweb 还原用户操作,排查线上 Bug
  • 强化学习核心:Exploit and Explore 策略与多臂老虎机算法
  • OpenAI 集成 LangChain 实战使用详解

相关免费在线工具

  • Base64 字符串编码/解码

    将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

  • Base64 文件转换器

    将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

  • Markdown转HTML

    将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

  • HTML转Markdown

    将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online

  • JSON 压缩

    通过删除不必要的空白来缩小和压缩JSON。 在线工具,JSON 压缩在线工具,online

  • JSON美化和格式化

    将JSON字符串修饰为友好的可读格式。 在线工具,JSON美化和格式化在线工具,online