Hosting in .NET Core

在.NET Core中,Host负责应用程序的启动和生命周期管理。除此之外,在Host中还可以设置日志(Logging)、配置(Configuration)和依赖关系注入(Dependency Injection)等。Host将一个常规的控制台应用程序(Console Application)变成了一个可以长时间运行的服务(Long-running Service)。

Hosting History

在.NET Core中,有以下2个Host:

  • .NET Generic Host(简称 Generic Host)

  • ASP.NET Core Web Host(简称 Web Host)

要了解它们之间的区别与联系,我们需要从.NET Core的发展历程中寻找答案。

微软在2016年6月发布了.NET Core 1.0。.NET Core是一个开放的、支持跨平台的框架,它与.NET Framework有着显著的不同。在这之后微软又陆续发布了.NET Core 1.1.NET Core 2.0.NET Core 2.1.NET Core 2.2.NET Core 3.0.NET Core 3.1

Web Host在.NET Core 1.0中被引入,它被用于配置并启动KestrelWeb服务器,在指定的端口上监听HTTP请求。Web Host正如它的名称所言,只用于Host ASP.NET Core Web Application。

Generic Host在.NET Core 2.1中被引入,但它只被用于non-HTTP的场景,例如hosted services/worker services。此时你仍需要使用Web Host来Host ASP.NET Core Web Application。这带来了一定的混淆和麻烦,很多相近的类被引入。

IWebHost 与 IHost,IWebHostBuilder与IHostBuilder

InterfaceNamespaceDefault ImplementationGit RepoSource Code
IWebHostMicrosoft.AspNetCore.HostingWebHosthttps://github.com/dotnet/aspnetcoresrc/Hosting/Hosting/src/Internal/WebHost.cs
IHostMicrosoft.Extensions.HostingHosthttps://github.com/dotnet/runtimesrc/libraries/Microsoft.Extensions.Hosting/src/Internal/Host.cs
IWebHostBuilderMicrosoft.AspNetCore.HostingWebHostBuilderhttps://github.com/dotnet/aspnetcoresrc/Hosting/Hosting/src/WebHostBuilder.cs
IHostBuilderMicrosoft.Extensions.HostingHostBuilderhttps://github.com/dotnet/runtimesrc/libraries/Microsoft.Extensions.Hosting/src/HostBuilder.cs

还有与这些接口相关的静态辅助类:

ClassNamespaceGit RepoSource Code
WebHostMicrosoft.AspNetCorehttps://github.com/dotnet/aspnetcoresrc/DefaultBuilder/src/WebHost.cs
HostMicrosoft.Extensions.Hostinghttps://github.com/dotnet/runtimesrc/libraries/Microsoft.Extensions.Hosting/src/Host.cs

我们在Program.cs文件中一般都是用这两个静态辅助类来创建IWebHost或IHost的具体实例,进而启动应用程序。

IHostingEnvironment vs IHostEnvironment vs IWebHostEnvironment

这几个接口是不是傻傻分不清?这其实充分说明了微软在主导.NET Core的开发过程中存在着管理和命名的混乱。这也难免,毕竟这么大的项目,而且代码库也是各管各的。

首先IHostingEnvironment存在于2个不同的命名空间中,虽然接口内容大致相同,但却是互不兼容的——它们之间没有继承关系。

InterfaceNamespaceGit RepoSource Code
IHostingEnvironmentMicrosoft.AspNetCore.Hostinghttps://github.com/dotnet/aspnetcoresrc/Hosting/Abstractions/src/IHostingEnvironment.cs
IHostingEnvironmentMicrosoft.Extensions.Hostinghttps://github.com/dotnet/runtimesrc/libraries/Microsoft.Extensions.Hosting.Abstractions/src/IHostingEnvironment.cs

从.NET Core 3.0起,这两个接口都被标记为obsolete,取而代之的分别是IWebHostEnvironment 与 IHostEnvironment。它们依然存在于不同的命名空间中,但它们之间有了继承关系。

InterfaceNamespaceGit RepoSource Code
IWebHostEnvironmentMicrosoft.AspNetCore.Hostinghttps://github.com/dotnet/aspnetcoresrc/Hosting/Abstractions/src/IWebHostEnvironment.cs
IHostEnvironmentMicrosoft.Extensions.Hostinghttps://github.com/dotnet/runtimesrc/libraries/Microsoft.Extensions.Hosting.Abstractions/src/IHostEnvironment.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
namespace Microsoft.AspNetCore.Hosting
{public interface IWebHostEnvironment : IHostEnvironment{string WebRootPath { get; set; }IFileProvider WebRootFileProvider { get; set; }}
}namespace Microsoft.Extensions.Hosting
{public interface IHostEnvironment{string EnvironmentName { get; set; }string ApplicationName { get; set; }string ContentRootPath { get; set; }IFileProvider ContentRootFileProvider { get; set; }}
}

这样的设计就很合理,也减少了重复。它们各自的默认实现也基本相同。

Default ImplementationNamespaceGit RepoSource Code
HostingEnvironmentMicrosoft.AspNetCore.Hostinghttps://github.com/dotnet/aspnetcoresrc/Hosting/Hosting/src/Internal/HostingEnvironment.cs
HostingEnvironmentMicrosoft.Extensions.Hosting.Internalhttps://github.com/dotnetsrc/libraries/Microsoft.Extensions.Hosting/src/Internal/HostingEnvironment.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
namespace Microsoft.AspNetCore.Hosting
{internal class HostingEnvironment : IHostingEnvironment, Extensions.Hosting.IHostingEnvironment,IWebHostEnvironment{public string EnvironmentName { get; set; } = Extensions.Hosting.Environments.Production;public string ApplicationName { get; set; }public string WebRootPath { get; set; }public IFileProvider WebRootFileProvider { get; set; }public string ContentRootPath { get; set; }public IFileProvider ContentRootFileProvider { get; set; }}
}namespace Microsoft.Extensions.Hosting.Internal
{public class HostingEnvironment : IHostingEnvironment, IHostEnvironment{public string EnvironmentName { get; set; }public string ApplicationName { get; set; }public string ContentRootPath { get; set; }public IFileProvider ContentRootFileProvider { get; set; }}
}

Generic Host 取代 Web Host

时间来到了.NET Core 3.0发布。微软重构了Generic Host,使之成为一个真正的通用的Host——可同时运行Worker Services和Web Applications。这大大简化了Host的模型及相关的类,开发者理解和使用起来更加容易了。

图片来自PluralSight课程

小结

  • 尽可能地使用IHostEnvironment

  • 官方不建议在.NET Core 3.0及以上的版本中使用Web Host

  • 对于ASP.NET Core Web Application来说,Kestrel Web Server被包装在GenericWebHostService中被Generic Host初始化并启动

微软于2020年11月发布了.NET 5.NET 5是.NET Core的下一个版本,被描述为.NET统一之旅中的第一个版本,它是为了使更多的开发人员能够将.NET框架代码和应用迁移到.NET 5。该平台将来自.NET Framework、.NET Core和Mono的代码组合在一起,为所有现代.NET应用提供一个单一的平台。本文所讨论的.NET Generic Host同样适用于.NET 5

CreateDefaultBuilder与ConfigureWebHostDefaults

一般情况下,我们使用静态辅助类Host中的CreateDefaultBuilder方法来创建IHostBuilder的实例。对于ASP.NET Core Web Application,我们还会调用ConfigureWebHostDefaults方法。我们需要了解这两个方法到底做了哪些默认的设置,以便减少不必要、多余的设置。

CreateDefaultBuilder 方法

  • 将内容根目录设置为由 GetCurrentDirectory 返回的路径

  • 通过以下项加载主机配置:

    • 前缀为 DOTNET_ 的环境变量

    • 命令行参数

  • 通过以下项加载应用配置:

    • appsettings.json

    • appsettings.{Environment}.json

    • 在 Development 环境中运行时的用户机密配置信息(secrets.json)

    • 环境变量

    • 命令行参数

  • 添加以下日志提供程序:

    • 控制台

    • 调试

    • EventSource

    • EventLog(仅当在 Windows 上运行时)

  • 在 Development 环境中,启用范围验证和依赖关系验证

图片来自PluralSight课程

ConfigureWebHostDefaults 方法

  • 从前缀为 ASPNETCORE_ 的环境变量加载主机配置。

  • 使用应用的托管配置提供程序将 Kestrel 服务器设置为 web 服务器并对其进行配置。

  • 如果 ASPNETCORE_FORWARDEDHEADERS_ENABLED 等于 true,则添加转接头中间件(ForwardedHeadersStartupFilter)。

  • 添加 IIS 集成。

推荐阅读源代码了解更多的实现细节

  • CreateDefaultBuilder

    • ConfigureDefaults

  • ConfigureWebHostDefaults

    • GenericWebHostBuilder

    • ConfigureWebDefaults

    • ConfigureWebHost

Generic Host 的启动与停止

启动

Generic Host 的启动步骤如下:

  1. Program.cs文件中,通过CreateDefaultBuilder构建一个IHost的实例

  2. 调用IHost上的静态扩展方法Run或RunAsync,这会间接调用到IHostStartAsync方法

  3. IHost的StartAsync方法则会遍历所有注册的IHostedService,调用它的StartAsync方法

  4. IHost上的静态扩展方法[Run或RunAsync]会调用另一个扩展方法——WaitForShutdownAsync,等待程序结束的信号

图片来自PluralSight课程
.NET Core 应用程序运行后会创建名为.NET Host(dotnet.exe)的后台进程。

停止

Generic Host 的停止步骤如下:

  1. 用户使用Ctrl + C或者应用程序使用代码来发出程序结束的信号

  2. IHost的StopAsync方法在WaitForShutdownAsync中被调用

  3. 所有注册的IHostedServiceStopAsync方法被调用

  4. 应用程序退出

图片来自PluralSight课程
需要指出的是,IHostedService的注册顺序是非常重要的,启动的时候是按注册顺序,停止的时候则是倒序。

其它的Host

在Windows操作系统中,你还会看到很多其它的Host。

Console Window Host(conhost.exe)

Console Window Host, 即命令行程序的宿主进程。典型的命令行程序有cmd.exe、nslookup.exe等。Console Window Host负责绘制命令行程序的图形化窗口,管理输入缓冲区屏幕缓冲区

Service Host(svchost.exe)

Service Host是一个共有的宿主进程的名称,它用来运行DLL文件中的服务,特别是很多系统服务。为了使这些服务之间保持隔离,减少相互影响导致的程序错误,系统会运行很多个Service Host的进程实例。你可以使用Process Explorer这个工具,通过Command Line列来区分它们。

DLL Host(dllhost.exe)

DLL Host程序又称为COM Surrogate,它是COM组件的宿主进程。COM(Component Object Model,组件对象模型)是微软于1993年提出的一种软件开发技术,它定义了组件对象进行交互的二进制接口标准。COM组件大多以动态链接库(DLL)的形式发布,DLL Host(dllhost.exe)则正是加载这些COM组件的宿主程序。与Service Host类似,系统会运行很多个DLL Host的进程实例。你可以使用Process Explorer这个工具,通过Command Line列来区分它们。

参考资料

  • ASP.NET Core Web Host

  • .NET Generic Host in ASP.NET Core

  • Building ASP.NET Core Hosted Services and .NET Core Worker Services

  • Introducing .NET Core

  • Announcing .NET Core 1.0

  • Announcing .NET 5.0

  • Understanding .NET Generic Host Model

  • Generic Host Builder in ASP .NET Core 3.1

  • Changes to Service Host grouping in Windows 10

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/302719.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何用大数据找女朋友?

全世界有3.14 % 的人已经关注了数据与算法之美导读找女朋友不仅需要好眼力,还需要一些技术含量。比如眼下正热的大数据,可以认真钻研,用数据分析来实现自己的“脱单计划”。小猿25岁,单身男,热衷大数据,并决…

ASP.NET Core 单元测试:如何 Mock HttpContext.Features.Get()

点击上方蓝字关注“汪宇杰博客”导语在 ASP.NET Core 里&#xff0c;如果你想单元测试 HttpContext.Features.Get<SomeType>()&#xff0c;这个技巧一定不要错过。问题我有个 Error 页面&#xff0c;需要取得异常的详细信息。我使用 HttpContext.Features.Get<IExcept…

mini api

大部分主流语言都支持web框架&#xff0c;并且实现起来相对轻便&#xff0c;简捷&#xff0c;比如&#xff1a;go的gin包package main import "github.com/gin-gonic/gin" func main() {r : gin.Default()r.GET("/ping", func(c *gin.Context) {c.JSON(200…

edge robert matlab,哪位熟悉matlab的大神路过瞄一眼哈

cxfx(believe truth believe me)UID240430帖子100精华积分1755蛋蛋币1755 枚威望0BT积分0阅读权限60性别男在线时间125 小时注册时间2013-3-27鸵鸟蛋主楼大中小发表于 2013-5-13 21:30 只看该作者哪位熟悉matlab的大神路过瞄一眼哈求大神指点迷津那&#xff01;谁来帮着看一下这…

php 图片 3d旋转图片,html5实现图片的3D旋转效果

我们先来看一下实现效果&#xff1a;(学习视频分享&#xff1a;html视频教程)H5旋转3D相册&#xff0c;鼠标放置暂停&#xff0c;图片灰度级为0&#xff0c;有放大效果。该实例运用H5和CSS3动画效果&#xff0c;未用javascript。提高了本人对CSS3 新属性的了解及掌握。完整代码…

数据这么多,且看R语言怎么处理!

随着科技的不断进步&#xff0c;数据处理量的不断增大&#xff0c;对数据进行处理、分析、统计建模、数据挖掘以及可视化的重要性日渐突出。如果说有一门简单易学、通俗易懂并且集上述功能为一体的编程语言让科研人员从中解脱出来&#xff0c;R语言当仁不让。作为一种统计分析软…

乘风破浪,.Net Core遇见Dapr,为云原生而生的分布式应用运行时

Dapr是一个由微软主导的云原生开源项目&#xff0c;国内云计算巨头阿里云也积极参与其中&#xff0c;2019年10月首次发布&#xff0c;到今年2月正式发布V1.0版本。在不到一年半的时间内&#xff0c;github star数达到了1.2万&#xff0c;超过同期的kubernetes、istio、knative等…

催人泪下!一个程序员的悲惨故事

全世界有3.14 % 的人已经关注了数据与算法之美编辑&#xff1a;大数据二狗如果你喜欢这篇文章&#xff0c;就把它发给朋友看吧~精品课程推荐&#xff1a;选购数学科普正版读物严选“数学思维好物”送给孩子的益智礼物 | 办公室神器算法工程师成长阅读 | 居家高科技理工…

双十一,单身狗除了买买买,还能做什么?

躲得过618&#xff0c;躲得过1024终究躲不过双十一小天相信&#xff0c;肯定有很多的小伙伴正磨刀霍霍对准自己的手这个节日小天陪你们买买买&#xff01;11月6~13日超级数学建模携手网易云课堂“超级充电节”为大家带来多重惊喜&#xff0c;福利享不停&#xff01;趁此机会赶紧…

将 SharePoint 开发与其他形式的开发进行比较

从三个视点检查 SharePoint 开发很有用&#xff1a; 为 .NET Framework 构建可扩展的应用程序 构建数据库应用程序 构建传统的富客户端应用程序将 SharePoint 应用程序与可扩展的 .NET Web 应用程序进行比较 您可以从开发人员的角度检查 SharePoint 开发&#xff0c;该开发人员…

Visual Studio 2022这些重大更新,影响每一位.NET开发者!

难得五一长假&#xff0c;蹲家里盘点了一下这2年.NET的发展&#xff0c;可谓日新月异&#xff0c;重现辉煌&#xff0c;各种重磅更新接踵而至&#xff1a;1 .NET Core3.1各种最受欢迎、性能排行等榜单霸榜&#xff0c;3个月增加100w的关注者&#xff1b;2 .NET5让.NET Framewor…

影响计算机算法世界的十位大师

全世界有3.14 % 的人已经关注了数据与算法之美1、伟大的智者——Don E.Knuth&#xff0c;中文名&#xff1a;高德纳(1938-)算法和程序设计技术的先驱者。Oh,God!一些国外网站这样评价他。一般说来&#xff0c;不知道此人的程序员是不可原谅的。其经典著作《计算机程序设计艺术》…

【翻译】WPF中的数据绑定表达式

有很多文章讨论绑定的概念&#xff0c;并讲解如何使用StaticResources和DynamicResources绑定属性。这些概念使用WPF提供的数据绑定表达式。在本文中&#xff0c;让我们研究WPF提供的不同类型的数据绑定表达式。介绍数据绑定是一种强大的技术&#xff0c;它允许数据在UI元素和业…

12个关键词,告诉你到底什么是机器学习

全世界只有3.14 % 的人关注了数据与算法之美编者按&#xff1a;随着人工智能(AI)技术对各行各业有越来越深入的影响&#xff0c;我们也更多地在新闻或报告中听到“机器学习”、“深度学习”、“增强学习”、“神经网络”等词汇&#xff0c;对于非专业人士来说略为玄幻。这篇文章…

MFC多语言实现方法

2019独角兽企业重金招聘Python工程师标准>>> 一、字符放在DLL资源文件中&#xff0c;切换资源模块(程序默认使用exe模块资源)。 实现要点&#xff1a; 新建一个只包含资源的DLL。通过函数AfxSetResourceHandle设置资源模块。 示意代码为&#xff1a; AfxSetResource…

oracle dbfile数,通过案例学调优之--Oracle参数(db_file_multiblock_read_count)

通过案例学调优之--Oracle参数(db_file_multiblock_read_count)应用环境&#xff1a;操作系统&#xff1a; RedHat EL55Oracle&#xff1a; Oracle 10gR2Oracle DB_FILE_MULTIBLOCK_READ_COUNT是Oracle比较重要的一个全局性参数&#xff0c;可以影响系统级别及sessioin级别。…

转行程序员后,我开始后悔没做这件事

全世界有3.14 % 的人已经关注了数据与算法之美程序 数据结构 算法 ——图灵奖得主&#xff0c;计算机科学家N.Wirth(沃斯)作为程序员&#xff0c;我们做机器学习也好&#xff0c;做python开发也好&#xff0c;java开发也好。有一种对所有程序员无一例外的刚需 —— 算法与数据…

工业互联网的两种极端想法和两点反思

目 录1. 概述2. 两种极端想法3. 两点反思1. 概述最近走访了很多企业&#xff0c;涉及到的行业包括&#xff1a;军工、特钢、有色、加工制造&#xff08;海洋钻井平台&#xff09;、建材、纺织等&#xff0c;在与不同的行业交流的过程中&#xff0c;我发现…

兵马未至,数据先行,且看如何进行数据挖掘!

从数据中抽取信息从信息中挖掘知识随着大数据时代的到来&#xff0c;数据挖掘的重要性越发显著。可谓是兵马未至&#xff0c;数据先行。所谓数据挖掘&#xff0c;一般是指从大型数据库中将隐藏的预测信息抽取出来的过程&#xff0c;而更为精确的解释就是“从数据中挖掘知识”。…

微软加入字节码联盟,进一步开发支持Blazor 的WebAssembly技术

字节码联盟 (Bytecode Alliance)宣布已正式成为 501(c)(3) 非营利组织&#xff0c;参与组建的企业/组织包括 Fastly、英特尔、Mozilla 和微软&#xff0c;此外还邀请到了 Arm、DFINITY Foundation、Embark Studios、谷歌、Shopify 和加州大学圣地亚哥分校加入并成为正式会员。B…