asp.net core 系列 18 web服务器实现
一.?ASP.NET Core Module
在介紹ASP.NET Core Web實(shí)現(xiàn)之前,先來(lái)了解下ASP.NET Core Module。該模塊是插入 IIS 管道的本機(jī) IIS 模塊(本機(jī)是指程序所部署的服務(wù)器)。是基于windows平臺(tái)處理 IIS和進(jìn)程內(nèi)IISHttpServer或Kestrel。用于:
(1) 在 IIS 工作進(jìn)程 (w3wp.exe) 內(nèi)托管 ASP.NET Core 應(yīng)用,稱為進(jìn)程內(nèi)托管模型。
(2) 將 Web 請(qǐng)求轉(zhuǎn)發(fā)到運(yùn)行 Kestrel 服務(wù)器的后端 ASP.NET Core 應(yīng)用,稱為進(jìn)程外托管模型。
在進(jìn)程內(nèi)托管時(shí),該模塊會(huì)使用 IIS 進(jìn)程內(nèi)服務(wù)器實(shí)現(xiàn),即IISHttpServer。在進(jìn)程外托管時(shí),該模塊僅適用于 Kestrel。 該模塊與 HTTP.sys 不兼容。關(guān)于IIS 在 Windows 上托管 ASP.NET Core。安裝ASP.NET Core Model,在 "asp.net core 系列 9 環(huán)境" 中有介紹。
--發(fā)布到iis上的配置節(jié)點(diǎn) <handlers><add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" /></handlers>?
二. ?windows平臺(tái)web服務(wù)器介紹
在windows平臺(tái)下,asp.net core有以下幾種HTTP 服務(wù)器組件:
(1) Kestrel服務(wù)器是默認(rèn)跨平臺(tái) HTTP 服務(wù)器實(shí)現(xiàn)。
(2) IISHttpServer 是IIS 的進(jìn)程內(nèi)服務(wù)器。
(3) HTTP.sys 服務(wù)器是僅用于 Windows 的 HTTP 服務(wù)器,它基于 HTTP.sys 核心驅(qū)動(dòng)程序和 HTTP 服務(wù)器 API。
當(dāng)使用 IIS 或 IIS Express 時(shí),應(yīng)用程序會(huì)在以下其中一個(gè)進(jìn)程中運(yùn)行:
(1) 在IIS工作進(jìn)程(進(jìn)程內(nèi)宿主模型)與IIS HTTP服務(wù)器的相同進(jìn)程中。推薦配置為In-process(用于windows上進(jìn)程內(nèi)托管)。
(2) 獨(dú)立于IIS工作進(jìn)程(進(jìn)程外宿主模型)的進(jìn)程中使用Kestrel服務(wù)器。配置為OutOfProcess
?
1.1? 進(jìn)程內(nèi)托管模型 In-process hosting model
使用進(jìn)程內(nèi)宿主,ASP.NET Core應(yīng)用程序運(yùn)行在與其IIS worker進(jìn)程相同的進(jìn)程中。進(jìn)程內(nèi)托管比進(jìn)程外托管提供了更好的性能,因?yàn)檎?qǐng)求不會(huì)通過(guò)環(huán)回適配器進(jìn)行代理,環(huán)回適配器是一個(gè)網(wǎng)絡(luò)接口,將傳出的網(wǎng)絡(luò)流量返回到同一臺(tái)機(jī)器。
由?ASP.NET Core Module執(zhí)行應(yīng)用初始化:(1)加載CoreCLR、(2)調(diào)用 Program.Main。以及處理 IIS 本機(jī)請(qǐng)求的生存期。
下圖說(shuō)明了 IIS、ASP.NET Core Module和進(jìn)程內(nèi)托管的應(yīng)用之間的關(guān)系:
?ASP.NET Core Module接收本機(jī)請(qǐng)求,并將它傳遞給 IISHttpServer?。 IISHttpServer?將請(qǐng)求從本機(jī)轉(zhuǎn)換為托管的 IIS 進(jìn)程內(nèi)服務(wù)器實(shí)現(xiàn)。
IISHttpServer?處理請(qǐng)求之后,請(qǐng)求會(huì)被推送到 ASP.NET Core 中間件管道中。?中間件管道處理該請(qǐng)求并將其作為?HttpContext?實(shí)例傳遞給應(yīng)用的邏輯(Application code)。?應(yīng)用的響應(yīng)傳遞回 IIS,IIS 將響應(yīng)推送回發(fā)起請(qǐng)求的客戶端。
?
1.2 進(jìn)程外托管模型 Out-of-process hosting model
因?yàn)锳SP.NET Core運(yùn)行在獨(dú)立于IIS工作進(jìn)程的進(jìn)程中, 因此該模塊負(fù)責(zé)進(jìn)程管理。該模塊在第一個(gè)請(qǐng)求到達(dá)時(shí)啟動(dòng) ASP.NET Core 應(yīng)用的進(jìn)程,并在應(yīng)用關(guān)閉或崩潰時(shí)重新啟動(dòng)該應(yīng)用。
下圖說(shuō)明了 IIS、ASP.NET Core Module和進(jìn)程外托管的應(yīng)用之間的關(guān)系:
ASP.NET Core Module在啟動(dòng)時(shí)通過(guò)環(huán)境變量指定端口,IIS 集成中間件將服務(wù)器配置為偵聽(tīng)?http://localhost:{PORT}。?執(zhí)行其他檢查,拒絕不是來(lái)自該ASP.NET Core Module的請(qǐng)求。
Kestrel 從ASP.NET Core Module獲取請(qǐng)求后,請(qǐng)求會(huì)被推送到 ASP.NET Core 中間件管道中。?中間件管道處理該請(qǐng)求并將其作為?HttpContext?實(shí)例傳遞給應(yīng)用的邏輯(Application code)。?IIS 集成添加的中間件會(huì)將方案、遠(yuǎn)程 IP 和 pathbase 更新到帳戶以將請(qǐng)求轉(zhuǎn)發(fā)到 Kestrel。?應(yīng)用的響應(yīng)傳遞回 IIS,IIS 將響應(yīng)推送回發(fā)起請(qǐng)求的 HTTP 客戶端。
最后對(duì)于非windows平臺(tái), asp.net core使用Kestrel ?Web服務(wù)器。這是默認(rèn)跨平臺(tái) HTTP 服務(wù)器實(shí)現(xiàn)。
?
二.?? Kestrel 服務(wù)器
Kestrel 是 ASP.NET Core 項(xiàng)目模板中包括的默認(rèn) Web 服務(wù)器。默認(rèn)情況下,ASP.NET Core 項(xiàng)目模板使用 Kestrel。 在 Program.cs 中,模板代碼調(diào)用 CreateDefaultBuilder,后者在后臺(tái)調(diào)用 UseKestrel。Kestrel 的使用方式如下:
(1) 它本身就是一個(gè)邊緣服務(wù)器,直接處理來(lái)自網(wǎng)絡(luò)(包括Internet)的請(qǐng)求。
(2) 與反向代理服務(wù)器(如 Internet Information Services (IIS)、Nginx 或 Apache)結(jié)合使用。 反向代理服務(wù)器接收來(lái)自 Internet 的 HTTP 請(qǐng)求,并將這些請(qǐng)求轉(zhuǎn)發(fā)到 Kestrel。
?
三. IISHTTPServer 服務(wù)器
? IISHTTPServer是 IIS 的進(jìn)程內(nèi)服務(wù)器且為進(jìn)程內(nèi)部署所必需。 ASP.NET Core Module 用于處理 IIS 和 IISHTTPServer之間的本機(jī) IIS 請(qǐng)求。
若要配置用于進(jìn)程內(nèi)托管的應(yīng)用,請(qǐng)將?<AspNetCoreHostingModel>?屬性添加到值為?InProcess(進(jìn)程外托管使用?OutOfProcess?進(jìn)行設(shè)置)的應(yīng)用項(xiàng)目文件。如果文件中不存在?<AspNetCoreHostingModel>?屬性,則默認(rèn)值為?OutOfProcess
<PropertyGroup><AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel></PropertyGroup>InProcess時(shí)使用 IIS HTTP 服務(wù)器 (IISHttpServer) 而不是 Kestrel 服務(wù)器。OutOfProcess時(shí)使用 Kestrel 服務(wù)器,而不是 IIS HTTP 服務(wù)器 (IISHttpServer)
?
四. HTTP.sys服務(wù)器
? ? ? ? ?如果 ASP.NET Core 應(yīng)用在 Windows 上運(yùn)行,則 HTTP.sys 是 Kestrel 的替代選項(xiàng)。為了獲得最佳性能,通常建議使用 Kestrel。?在應(yīng)用向 Internet 公開(kāi)且所需功能受 HTTP.sys(而不是 Kestrel)支持的方案中,可以使用 HTTP.sys。
配置 ASP.NET Core 應(yīng)用以使用 HTTP.sys。構(gòu)建 Web 主機(jī)時(shí)調(diào)用 UseHttpSys 擴(kuò)展方法,同時(shí)指定所需的 HTTP.sys 選項(xiàng)。在 Visual Studio 中,默認(rèn)啟動(dòng)配置文件是針對(duì) IIS Express 的。?若要作為控制臺(tái)應(yīng)用運(yùn)行該項(xiàng)目,請(qǐng)手動(dòng)更改所選配置文件。
public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>WebHost.CreateDefaultBuilder(args).UseStartup<Startup>().UseHttpSys(options =>{// The following options are set to default values.options.Authentication.Schemes = AuthenticationSchemes.None;options.Authentication.AllowAnonymous = true;options.MaxConnections = null;options.MaxRequestBodySize = 30000000;options.UrlPrefixes.Add("http://localhost:5000");});
五. http/2.0支持
以下部署方案中的 ASP.NET Core 支持 HTTP/2
| Kestrel | 操作系統(tǒng): Windows Server 2016/Windows 10 或更高版本 具有 OpenSSL 1.0.2 或更高版本的 Linux macOS 的未來(lái)版本將支持 HTTP/2 | 目標(biāo)框架: .NET Core 2.2 或更高版本 |
| HTTP.sys | 操作系統(tǒng): Windows Server 2016/Windows 10 或更高版本 | 目標(biāo)框架: 不適用于 HTTP.sys部署。 |
| IIS(進(jìn)程內(nèi)) | 操作系統(tǒng): Windows Serve IIS 10 或更高版本 IIS 10 或更高版本 | 目標(biāo)框架: .NET Core 2.2 或更高版本 |
| IIS(進(jìn)程外) | 操作系統(tǒng): Windows Serve IIS 10 或更高版本 IIS 10 或更高版本 面向公眾的邊緣服務(wù)器連接使用 HTTP/2,但與 Kestrel 的反向代理連接使用 HTTP/1.1。 | 目標(biāo)框架: 不適用于 IIS 進(jìn)程外部署。 |
?
總結(jié):
(1) ASP.NET Core Module模塊是適應(yīng)于windows平臺(tái)上的iis。
(2) 進(jìn)程內(nèi)托管模型是使用 IISHttpServer是適應(yīng)于windows平臺(tái)上 IIS 的進(jìn)程內(nèi)服務(wù)器,。將ASP.NET Core Module接收的請(qǐng)求轉(zhuǎn)換為托管的 IIS 進(jìn)程內(nèi)服務(wù)器實(shí)現(xiàn)。用IISHttpServer服務(wù)器。
(3) 進(jìn)程外托管模型是獨(dú)立于iis, 可以做反向代理,?用Kestrel 服務(wù)器,可以應(yīng)用在windows或linux平臺(tái)上。
(4) 如果 ASP.NET Core 應(yīng)用在 Windows 上運(yùn)行,則 HTTP.sys 是 Kestrel 的替代選項(xiàng)。為了獲得最佳性能,通常建議使用 Kestrel。?
(5) Kestrel 是 ASP.NET Core 項(xiàng)目模板中默認(rèn) Web 服務(wù)器.可以結(jié)合反向代理服務(wù)器一起使用(如 Internet Information Services (IIS)、Nginx 或 Apache)。
?
?
參考文獻(xiàn):
ASP.NET Core 中的 Kestrel Web 服務(wù)器參數(shù)設(shè)置
https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-2.2
ASP.NET Core 中的 HTTP.sys Web 服務(wù)器參數(shù)設(shè)置
https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/servers/httpsys?view=aspnetcore-2.2
關(guān)于ASP.NET Core 中的aspnet-core-module
? ?https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/aspnet-core-module?view=aspnetcore-2.2
使用 Nginx 在 Linux 上托管 ASP.NET Core
https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/linux-nginx?view=aspnetcore-2.2
關(guān)于Linux 上 .NET Core 的先決條件
https://docs.microsoft.com/zh-cn/dotnet/core/linux-prerequisites?tabs=netcore2x
?
轉(zhuǎn)載于:https://www.cnblogs.com/MrHSR/p/10324110.html
總結(jié)
以上是生活随笔為你收集整理的asp.net core 系列 18 web服务器实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 前端开发-日常开发沉淀之生产环境与开发环
- 下一篇: [Head First设计模式笔记]--