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

Ash*_*thi 41 c# asp.net-core asp.net-core-2.1 asp.net-core-3.0

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

asp.net core 2.1 程序.cs

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

public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
    WebHost.CreateDefaultBuilder(args)
        .UseStartup<Startup>();
Run Code Online (Sandbox Code Playgroud)

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>();
        });
Run Code Online (Sandbox Code Playgroud)

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

但是我在这里没有明确的想法 Host 和 WebHost 之间有什么区别以及为什么 asp.net core 3.0 应用程序不允许创建 WebHost?

Shu*_*ogi 47

在 .NET Core 3.0 与 .NET Core 2.2 代码中可以看到的区别在于 .NET Core 3.0 使用通用主机,而 .NET Core 2.2 使用Web 主机来运行 Web 应用程序。通用主机包含在 ASP.NET CORE 2.1 中,并成为 .NET Core 未来版本的事实上的标准。尽管通用主机包含在 .NET core 2.1 中,但它仅用于非 HTTP 工作负载。在 .NET Core 3.0 中,它成为通用标准(HTTP + 非 HTTP 工作负载)。

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

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

使用ConfigureWebHostDefaults 的原因是新的主机构建器是一个通用主机构建器,因此重要的是要告诉我们我们打算为 Web 主机配置默认设置。

请参阅 Microsoft 参考,该参考建议在此处使用 Generic Host

  • 是的,我们可以在 Asp.et core 中使用 Web Host,因为 .NET 的向后兼容性,但使用 HOST 是事实上的标准。 (3认同)
  • 谢谢,@SimonTremblay。我已经按照建议添加了微软官方文档链接 (2认同)