在NET中有三个不同的主机:

  • .NET WebApplication 主机,也称为最小主机。

这是.NET 6中的一个新特性,旨在提供最小的启动时间和内存消耗。最小主机只包括.NET运行时的最基本组件和依赖项,因此启动时间非常快,内存消耗也非常低。最小主机适用于只需要最少.NET运行时支持的应用程序,例如控制台应用程序和小型服务。

通过WebApplication 类调用CreateBuilder方法创建WebApplicationBuilder对象,调用Build方法配置主机、添加服务、 IHost 实例,调用Run方法运行Host

  • .NET 通用主机

通用主机是.NET Core中的一种主机类型,可以用于各种.NET应用程序类型,包括ASP.NET Core Web应用程序、控制台应用程序和Windows服务等。通用主机包含.NET运行时的完整版本,启动时间和内存消耗相对较高,但具有更强的灵活性和适应性。通用主机可以在启动时加载不同的应用程序托管模型,并提供更丰富的配置选项和生命周期管理功能。

通过Host类调用CreateDefaultBuilder方法创建HostBuilder 对象创建 IHost 实例,调用Run方法运行

  • ASP.NET Core Web 主机

用于运行基于ASP.NET Core的Web应用程序。它能够处理HTTP请求,并将其路由到相应的控制器、动作和视图等Web应用程序组件。

通过WebHost类调用 CreateDefaultBuilder方法创建WebHostBuilder对象,调用Run方法运行

相同点:

三种主机都提供了应用程序的托管和生命周期管理能力。

三种主机模型都是基于托管的.NET 运行时(CLR/.NET Core)构建的。

它们都支持使用依赖注入(DI)来管理应用程序的依赖关系。

它们都支持配置文件和环境变量来配置应用程序的行为。

它们都可以与不同的中间件和扩展集成,以满足特定应用程序的需求。

1. 最小主机创建代码和流程图

官方文档:https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/minimal-apis/webapplication?view=aspnetcore-7.0

var builder = WebApplication.CreateBuilder(args);

var app = builder.Build();

app.MapGet("/", () => "Hello World!");

app.Run();

CreateBuilder方法源码:https://source.dot.net/#Microsoft.AspNetCore/WebApplication.cs,77d59c0a99dedcf9,references

Build方法源码:https://source.dot.net/#Microsoft.AspNetCore/WebApplicationBuilder.cs,06eb5ff86e015ba3,references

Run方法源码:https://source.dot.net/#Microsoft.AspNetCore/WebApplication.cs,a01dc35d221adf28,references

官方文档摘要:

WebApplication 根据某些条件自动添加以下中间件:

当 HostingEnvironment 为 "Development" 时,将首先添加 UseDeveloperExceptionPage。

如果用户代码尚未调用 UseRouting 并且配置了终结点(例如 app.MapGet),则其次添加 UseRouting。

如果配置了任何终结点,则会在中间件管道的末尾添加 UseEndpoints。

如果在服务提供程序中可以检测到 IAuthenticationSchemeProvider,则会在 UseRouting 后立即添加 UseAuthentication。 使用 AddAuthentication 时,默认情况下会添加 IAuthenticationSchemeProvider,并使用 IServiceProviderIsService 检测服务。

如果在服务提供程序中可以检测到 IAuthorizationHandlerProvider,则接下来添加 UseAuthorization。 使用 AddAuthorization 时,默认情况下会添加 IAuthorizationHandlerProvider,并使用 IServiceProviderIsService 检测服务。

在 UseRouting 和 UseEndpoints 之间添加用户配置的中间件和终结点。

通用主机创建代码

官方文档:https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/host/generic-host?view=aspnetcore-7.0

await Host.CreateDefaultBuilder(args)

 .ConfigureServices(services =>

 {

 services.AddHostedService<SampleHostedService>();

 })

 .Build()

 .RunAsync();

对于 HTTP 工作负载,在 CreateDefaultBuilder 之后调用 ConfigureWebHostDefaults:

await Host.CreateDefaultBuilder(args)

 .ConfigureWebHostDefaults(webBuilder =>

 {

 webBuilder.UseStartup<Startup>();

 })

 .Build()

 .RunAsync();

CreateDefaultBuilder方法源码:https://source.dot.net/#Microsoft.Extensions.Hosting/Host.cs,57374a8a9c12f043,references

ConfigureServices方法源码:https://source.dot.net/#Microsoft.Extensions.Hosting/HostBuilder.cs,857da125f73c1248,references

ConfigureWebHostDefaults方法源码:https://source.dot.net/#Microsoft.AspNetCore/GenericHostBuilderExtensions.cs,c2654623b64e92e3,references

NET主机讲解:https://www.cnblogs.com/xiaoxiaotank/p/15273093.html

`ConfigureServices` 和 `ConfigureWebHostDefaults` 都是 ASP.NET Core 中用于配置和构建 Web 主机的方法,但它们的作用和使用方式有一些区别和相同点。

相同点:

1. 都是用于配置和构建 Web 主机。它们都提供了一种方式来定义和设置应用程序的不同方面,例如中间件、服务、路由等。

2. 都是在 ASP.NET Core 应用程序的启动过程中被调用。它们在 Web 主机构建的过程中起到关键作用,用于定义应用程序的行为和功能。

区别:

1. `ConfigureServices` 方法是用于配置应用程序的服务容器(Service Container),它用于注册和配置应用程序所需的依赖关系和服务。通常在这个方法中,您可以添加和配置各种服务,例如数据库上下文、身份验证服务、日志服务等。

示例:

 public void ConfigureServices(IServiceCollection services)

 {

 services.AddDbContext<MyDbContext>();

 services.AddAuthentication();

 services.AddLogging();

 // 添加其他服务和依赖关系

 }

2. `ConfigureWebHostDefaults` 方法是用于配置 WebHostBuilder,它用于构建 Web 主机并设置应用程序的行为和功能。通常在这个方法中,您可以添加中间件组件、配置路由、设置静态文件服务等。

示例:

public void Configure(IApplicationBuilder app)

 {

 app.UseRouting();

 app.UseAuthentication();

 app.UseAuthorization();

 // 添加其他中间件和配置

 }

3. `ConfigureServices` 方法在 Web 主机的构建过程中较早调用,用于配置服务容器。而 `ConfigureWebHostDefaults` 方法在 `ConfigureServices` 方法之后被调用,用于配置 Web 主机的行为。

综上所述,`ConfigureServices` 方法用于注册和配置应用程序的服务,而 `ConfigureWebHostDefaults` 方法用于配置 Web 主机的行为和功能。它们在应用程序启动过程中的执行顺序是 `ConfigureServices` 先于 `ConfigureWebHostDefaults`。

ASP.NET Core Web 主机创建代码和流程图

官方文档:https://learn.microsoft.com/zh-cn/aspnet/core/fundamentals/host/web-host?view=aspnetcore-7.0

public class Program
{
public static void Main(string[] args)
{ CreateWebHostBuilder(args).Build().Run();
} public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
WebHost.CreateDefaultBuilder(args)
.UseStartup<Startup>();
}

CreateDefaultBuilder方法源码:https://source.dot.net/#Microsoft.AspNetCore/WebHost.cs,466deb0927717f4d,references

UseStartup方法源码:https://source.dot.net/#Microsoft.AspNetCore.Hosting/WebHostBuilderExtensions.cs,f7d4fb6cc448355e,references

WebHostBuilder、HostBuilder、WebApplicationBuilder三者之间的关系

在 .NET 中,WebHostBuilder、HostBuilder 和 WebApplicationBuilder 是用于构建和配置应用程序主机的不同类型的构建器。

WebHostBuilder

是用于构建 ASP.NET Core Web 应用程序的主机。它提供了配置 Web 服务器、加载应用程序配置、设置日志记录和启动应用程序的功能。WebHostBuilder 是在使用传统的 ASP.NET Core Web 应用程序模型时使用的。

HostBuilder

是一个通用的构建器,用于构建和配置通用的 .NET 主机。它适用于构建各种类型的应用程序,包括控制台应用程序、后台服务、ASP.NET Core Web 应用程序等。HostBuilder 提供了配置应用程序的主要功能,例如加载配置、设置依赖注入容器、配置日志记录和启动应用程序。

WebApplicationBuilder

是在 ASP.NET Core 6 中引入的新的构建器,它是 WebHostBuilder 的替代品。WebApplicationBuilder 提供了更简化的 API 和更直观的方式来构建和配置 ASP.NET Core Web 应用程序。它内置了一些常用的默认配置,并提供了更灵活的扩展性。使用 WebApplicationBuilder 可以更轻松地设置服务器、配置中间件管道、加载应用程序配置等。

综上所述,WebHostBuilder 用于构建 ASP.NET Core Web 应用程序的主机,HostBuilder 是一个通用的构建器,适用于各种类型的应用程序,而 WebApplicationBuilder 是 ASP.NET Core 6 中用于构建 Web 应用程序的新的更简化的构建器。

NET中三种主机简单理解的更多相关文章

  1. CSS格式与布局中三种位置的理解与应用

    第一种位置关系:position:fixed  锁定位置(相对于整个浏览器的位置),常用在各大网站的右下角或其它位置的小广告. 如果需要调整锁定位置,需要使用如下方式:<div style=&q ...

  2. iOS开发UI篇—iOS开发中三种简单的动画设置

    iOS开发UI篇—iOS开发中三种简单的动画设置 [在ios开发中,动画是廉价的] 一.首尾式动画 代码示例: // beginAnimations表示此后的代码要“参与到”动画中 [UIView b ...

  3. 转-Web Service中三种发送接受协议SOAP、http get、http post

    原文链接:web服务中三种发送接受协议SOAP/HTTP GET/HTTP POST 一.web服务中三种发送接受协议SOAP/HTTP GET/HTTP POST 在web服务中,有三种可供选择的发 ...

  4. 深入浅出spring IOC中三种依赖注入方式

    深入浅出spring IOC中三种依赖注入方式 spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖注入和 ...

  5. 转:VMware中三种网络连接的区别

    转自:http://www.cnblogs.com/rainman/archive/2013/05/06/3063925.html VMware中三种网络连接的区别   1.概述 2.bridged( ...

  6. C#中事件流程的简单理解

    C#中事件流程的简单理解 C#中事件基于委托,要理解事件要先理解委托,但是现在我还没想好怎么写委托,如果不懂委托可以先找找委托的文章 事件基于委托,为委托提供了一种发布/订阅机制 一上来就是这句话,很 ...

  7. C#中三种定时器对象的比较

    ·关于C#中timer类 在C#里关于定时器类就有3个1.定义在System.Windows.Forms里2.定义在System.Threading.Timer类里3.定义在System.Timers ...

  8. C#中三种定时器对象的比较 【转】

    https://www.cnblogs.com/zxtceq/p/5667281.html C#中三种定时器对象的比较 ·关于C#中timer类 在C#里关于定时器类就有3个1.定义在System.W ...

  9. Spring中三种配置Bean的方式

    Spring中三种配置Bean的方式分别是: 基于XML的配置方式 基于注解的配置方式 基于Java类的配置方式 一.基于XML的配置 这个很简单,所以如何使用就略掉. 二.基于注解的配置 Sprin ...

  10. VMWare中三种网络连接模式的区别

    VMWare中有桥接.NAT.host-only三种网络连接模式,在搭建伪分布式集群时,需要对集群的网络连接进行配置,而这一操作的前提是理解这三种网络模式的区别. 参考以下两篇文章可以更好的理解: V ...

随机推荐

  1. uniapp 消息推送

    1.前言 作为一个非原生App的开发者,对于手机系统的推送机制了解是是非有限的,只有了解清楚这些机制,后期的开发才会少踩很多坑,本文将对推送机制逻辑进行一个简单的梳理与记录 2.推送流程 推送流程1. ...

  2. 记一次vsix安装异常

    vsix是vs扩展安装的包,里面包含了vs扩展功能的相关内容和元数据. 由于个人需求,我通过zip工具,对其中的许可文件进行了更新,将EULA.rtf替换为eula.txt.但在安装过程中报错,日志提 ...

  3. oracle客户端安装先决条件检查出现PRVF-7531错误

    场景:在局域网内,远程一台客户机进行客户端安装 度娘后,说一般情况下,由于操作系统未开启默认共享,导致Oracle无法检查环境的可用性. 查看server服务正常开启. 通过net share将c进行 ...

  4. CVE-2023-32233 Linux 内核 UAF 漏洞分析与利用

    Linux 内核 nftable 模块在处理匿名 set 时存在 UAF. ‍ 漏洞分析 漏洞成因是 nf_tables_deactivate_set​ 在释放匿名 set 时没有将 set 的标记设 ...

  5. 【自制FOC驱动器】深入浅出讲解FOC算法与SVPWM技术

    转载自 http://www.pengzhihui.xyz/2020/07/02/foc/ 前言前阵子工作太忙,好久没做个人项目了,最近久违地想做一个机器人项目,设计中需要用到高性能超小体积的伺服电机 ...

  6. 论文解读《The Philosopher’s Stone: Trojaning Plugins of Large Language Models》

    发表时间:2025 期刊会议:Network and Distributed System Security (NDSS) Symposium 论文单位:Shanghai Jiao Tong Univ ...

  7. 【前端】HTML编码效提升:快速生成HTML标签

    目录 1.生成多级标签 2.生成同级标签 3.生成注释 4.生成多个相同标签 5.生成带class标签 6生成带id标签. 7.生成带内容标签1 8.生成带内容标签2 9.生成带属性标签 GIF演示: ...

  8. Shell三元表达式

    Shell三元表达式   shell能否实现三元表达式呢?像下面这样: int a = (b == 5) ? c : d; 实现方法: a=$([ "$b" == 5 ] & ...

  9. 即时通讯技术文集(第32期):IM开发综合技术合集(Part5) [共12篇]

    为了更好地分类阅读 52im.net 总计1000多篇精编文章,我将在每周三推送新的一期技术文集,本次是第32 期. [- 1 -] IM开发干货分享:如何优雅的实现大量离线消息的可靠投递 [链接]  ...

  10. 百度统一socket长连接组件从0到1的技术实践

    本文由百度消息中台团队分享,引用自百度Geek说,原题"百度iOS端长连接组件建设及应用实践",为了帮助理解,本文有修订和改动. 1.引言 在过去的十年里,移动端互联网技术飞速发展 ...