![](/img/trans.png)
[英]What's the difference between these ways to start/run a Generic Host in ASP.NET Core?
[英]What is the difference between Host and WebHost class in asp.net core
我試圖將我的應用程序從 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>();
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?
在 .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
主機負責應用程序啟動和生命周期管理。 服務器負責接受 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 來構建主機。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.