IWebHost WebHostBuilder BuildWebHost有什么区别

Dji*_*ios 10 asp.net-core asp.net-core-2.0

微软的文档非常糟糕.我需要将我开发的.net core 2 Web应用程序部署到IIS服务器,我无法直接回答任何问题.这只是我提问的开始.

IWebHost,WebHostBuilder,BuildWebHost有什么区别?

谢谢!

pok*_*oke 27

首先,让我先说一下我非常不同意你的陈述:ASP.NET Core的文档实际上非常好.是的,它可能仍然缺乏一些细节,它也有一些问题赶上发布的变化,但总的来说内容非常好,而且正在努力的团队真的做得非常出色.为这么大且快速移动的框架编写文档真的很难,而且通过文档获得的信息量实际上非常好.一旦你克服了从新框架开始的初始问题,你可能会认识到这一点.

但回到你的问题:

  • IWebHost:Web主机是托管和运行Web应用程序的常规方式.它在应用程序启动时创建,然后它将构建所有必需的部分,如Kestrel Web服务器,应用程序中间件管道和所有其他位,并连接它们,以便您的应用程序准备好为您的请求提供服务.

    Web主机基本上就是构成Web应用程序的东西.

  • IWebHostBuilder:Web主机构建器基本上是用于创建Web主机的工厂.这是构建Web主机的东西,但也配置了Web主机确定如何运行Web应用程序所需的所有必需位.

    使用ASP.NET Core 2,您通常会创建一个"默认Web主机构建器",它已经有很多默认值.例如,默认Web主机将设置Kestrel Web服务器,启用和配置日志记录,并添加对appsettings.json配置的支持.

    通常,您的应用程序将始终以这样的默认Web主机启动,然后您只需使用Web主机构建器随后在实际构建之前配置Web主机.

  • BuildWebHost是ASP.NET Core 2.1之前的旧约定的一部分,其中默认模式Program.cs是在单独的方法中构建Web主机.使用2.1,这已被更改,以便该方法不再直接构建 Web主机,而只是创建 Web主机构建器(因此现在调用该方法CreateWebHostBuilder).所以基本上,.Build()Web主机构建器上的调用是从方法中重构的.您可以在2.0到2.1迁移指南中很好地看到这一点.

    这样做的原因是使可CreateWebHostBuilder重复使用.在该方法中发生的构建器配置基本上是配置Web主机所需的一切.因此,通过使其可重用,而不生成实际创建的Web主机,它可以用于其他目的.在这种情况下,这是使用TestHost.进行集成测试.测试主机基本上将在内部托管Web主机以进行集成测试,并且它将通过查找CreateWebHostBuilder方法来实现.

现在,您在Program.csASP.NET Core 2.1中看到的默认模式如下(我添加的注释用于进一步说明):

public class Program
{
    // main entry point for your application
    public static void Main(string[] args)
    {
        // create the web host builder
        CreateWebHostBuilder(args)
            // build the web host
            .Build()
            // and run the web host, i.e. your web application
            .Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        // create a default web host builder, with the default settings and configuration
        WebHost.CreateDefaultBuilder(args)
            // configure it to use your `Startup` class
            .UseStartup<Startup>();
}
Run Code Online (Sandbox Code Playgroud)

顺便说一句.这个主题通常包含在官方文档的应用程序启动托管部分中.

  • 谢谢你的回答.对于那些非常熟悉框架的人来说,微软的文档可能非常好,但对于那些正在学习或不熟悉框架的人来说,这真的很难.其他框架的文档并不复杂和技术性,通常可以更好地解释.这是一个很好的开始,让我更接近我达到的目标,我非常感谢你写这篇文章的时间,谢谢. (6认同)
  • 那么 IHostBuilder 又如何呢? (3认同)
  • @AkmalSalikhov 我添加了有关 ASP.NET Core 3.0 及更高版本中情况的更多详细信息,解释了“通用主机”如何适应这种情况。 (3认同)
  • 当道格拉斯·亚当斯 (Douglas Adams) 写道“有一种理论表明,如果有人确切地发现了宇宙的用途,宇宙就会立即消失,并被更奇怪和莫名其妙的东西所取代”,他实际上是在谈论微软的 ASP 框架, (3认同)
  • @DjigStudios我想你会发现文档很复杂,因为框架很复杂。我同意戳;.NET Core 文档是我见过的最好的文档之一,其中包含几乎每个核心概念的长篇文章,以及很好的示例和教程。但如果有什么安慰的话,当我开始使用 .NET Core 时,我也感到同样不知所措。它只是一个需要你理解的复杂框架。 (2认同)