asp.net core中的Host和WebHost类有啥区别

Posted

技术标签:

【中文标题】asp.net core中的Host和WebHost类有啥区别【英文标题】:What is the difference between Host and WebHost class in asp.net coreasp.net core中的Host和WebHost类有什么区别 【发布时间】:2020-05-01 20:45:53 【问题描述】:

我试图将我的应用程序从 asp.net core 2.1 迁移到 3.0,并且在 program.cs 中出现了第一个建议更改以创建主机。

asp.net core 2.1 program.cs

public static void Main(string[] args)

    CreateWebHostBuilder(args).Build().Run();


public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>();

asp.net core 3.0 程序.cs

public static void Main(string[] args)

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


public static IHostBuilder CreateHostBuilder(string[] args) =>
    Host.CreateDefaultBuilder(args)
        .ConfigureWebHostDefaults(webBuilder =>
        
            webBuilder.UseStartup<Startup>();
        );

我可以看到,在 asp.net core 3.0 中,它正在创建 Host 而不是 WebHost,并在创建 Host 时注入 WebHostBuilder。

但是我在这里并不清楚Host和WebHost之间有什么区别以及为什么asp.net core 3.0应用程序不允许创建WebHost?

【问题讨论】:

【参考方案1】:

主机负责应用程序的启动和生命周期管理。服务器负责接受 HTTP 请求。主机的部分责任包括确保应用程序的服务和服务器可用且配置正确。您可以将主机视为服务器的包装器。主机被配置为使用特定的服务器;服务器不知道它的主机。

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Threading.Tasks;
using Microsoft.AspNetCore.Hosting;

namespace WebApplication1

    public class Program
    
        public static void Main(string[] args)
        
            var host = new WebHostBuilder()
                .UseKestrel()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseIISIntegration()
                .UseStartup<Startup>()
                .Build();

            host.Run();
        
    

您使用 WebHostBuilder 的实例创建主机。这通常在您的应用程序的入口点完成:public static void Main。一个典型的 Program.cs 如下所示,演示了如何使用 WebHostBuilder 构建主机。

【讨论】:

这似乎无法回答问题。它回答“什么是主机?”而不是“HostWebHost 有什么区别?”。【参考方案2】:

.NET Core 3.0 与 .NET Core 2.2 代码的区别在于 .NET Core 3.0 使用 Generic Host,而 .NET Core 2.2 使用 Web Host 用于 Web 应用程序。 通用主机包含在 ASP.NET CORE 2.1 中,并成为 .NET Core 未来版本的事实标准。虽然 Generic 主机包含在 .NET core 2.1 中,但它仅用于非 HTTP 工作负载。在 .NET Core 3.0 中,它成为了一个通用标准(HTTP + 非 HTTP 工作负载)。

从 WebHost 构建器转移到更通用的 Host 构建器的原因是因为 WebHost 构建器更多地与 HTTP 请求绑定,并且适用于 Web 应用程序,但随着微服务和 Docker 的出现,它感觉需要更通用的 Web 主机因此 .NET Core 团队对其进行了改进,使其也可用于控制台应用程序。通过通用主机,可以在控制台应用程序中使用日志记录、配置和 DI 库

要创建主机,我们可以使用新的 HostBuilder,它具有与现有 WebHostBuilder 类似的一组方法和扩展。需要注意一个主要区别,那就是 HostBuilder 没有提供一个扩展方法,让您可以像使用 WebHostBuilder 一样使用启动类。这个决定主要是为了避免在幕后创建两个单独的 DI 容器。使用通用主机,配置单个服务集合,然后用于构建最终的服务提供者。

使用 ConfigureWebHostDefaults 的原因是新的主机生成器是通用主机生成器,因此重要的是告诉我们打算为 Web 主机配置默认设置.

请参考推荐使用通用主机here的微软参考

【讨论】:

.Net core 3.0的nst,我们仍然可以在asp.net core 3.0中使用WebHost 是的,由于 .NET 的向后兼容性,我们可以在 Asp.et 核心中使用 Web Host,但使用 HOST 是事实上的标准。 你的帖子是对的,我认为我们应该添加微软的官方参考,确认 Generic Host 现在是推荐方式。 docs.microsoft.com/en-us/aspnet/core/fundamentals/host/… 谢谢,@SimonTremblay。我已经按照建议添加了微软官方文档链接 从 Web 主机更新到通用主机时是否还有其他“重大变化”,应该注意或可以安全更新吗?

以上是关于asp.net core中的Host和WebHost类有啥区别的主要内容,如果未能解决你的问题,请参考以下文章

探索Asp net core3中的 项目文件Program.cs和通用host(译)

.NET 6 中将 ASP.NET Core 注册成 Windows Service

理解ASP.NET Core

ASP.NET Core WebSockets

一张图理清ASP.NET Core启动流程

ASP.NET Core 和 Entity Framework Core:Linq 中的左(外)连接