В чем разница между классом Host и WebHost в ядре asp. net - PullRequest
7 голосов
/ 15 января 2020

Я пытался перенести мое приложение с 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 program.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 он создает хост вместо WebHost и внедряет WebHostBuilder при создании хоста.

Но у меня нет четкого представления о том, в чем разница между хостом и WebHost и почему asp. net приложение ядра 3.0. не позволяет создать WebHost?

Ответы [ 2 ]

6 голосов
/ 18 января 2020

Разница, которую можно увидеть в. NET Core 3.0 против. NET Код core 2.2 заключается в том, что NET core 3.0 использует Generi c Host while. NET Core 2.2 используйте веб-хост для веб-приложения. Хост Generi c был включен в ASP. NET CORE 2.1 и стал стандартом де-факто для будущей версии. NET Core. Хотя хост Generi c был включен в. NET core 2.1, но он использовался только для рабочих нагрузок без HTTP. В. NET Core 3.0 он стал универсальным стандартом (рабочие нагрузки HTTP + не HTTP).

Причина перехода от компоновщика WebHost к более универсальному c компоновщику хоста заключается в том, что компоновщик WebHost был более привязан к HTTP-запрос хорошо работает для веб-приложений, но с появлением Microservices и Docker возникла потребность в более универсальном c веб-хосте, поэтому. NET Основная команда обновила его, сделав его пригодным для использования и с консольным приложением. С Generi c Host можно использовать библиотеки ведения журнала, конфигурации и DI в консольном приложении .

Для создания хоста мы можем использовать новый HostBuilder, который имеет набор методов и расширений, аналогичный существующему WebHostBuilder. Есть одно главное отличие, о котором следует знать, и это HostBuilder не делает предоставить метод расширения, который позволяет вам использовать класс запуска как мы можем с WebHostBuilder . Это решение было принято главным образом, чтобы избежать необходимости создавать два отдельных контейнера DI за кулисами. На хосте generi c настраивается один набор служб, который затем используется для построения конечного поставщика услуг.

Причина использования ConfigureWebHostDefaults в том, что Новый Host Builder - Generi c Host Builder, поэтому важно сказать, что мы намерены настроить параметры по умолчанию для веб-хоста.

0 голосов
/ 15 января 2020

Хост отвечает за запуск приложения и управление временем жизни. Сервер отвечает за прием 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. Обычно это делается в точке входа вашего приложения: publi c stati c void Main. Типичный файл Program.cs, показанный ниже, демонстрирует, как использовать WebHostBuilder для сборки хоста.

...