asp.net core 系列 18 web服务器实现
一.?ASP.NET Core Module
在介紹ASP.NET Core Web實現之前,先來了解下ASP.NET Core Module。該模塊是插入 IIS 管道的本機 IIS 模塊(本機是指程序所部署的服務器)。是基于windows平臺處理 IIS和進程內IISHttpServer或Kestrel。用于:
(1) 在 IIS 工作進程 (w3wp.exe) 內托管 ASP.NET Core 應用,稱為進程內托管模型。
(2) 將 Web 請求轉發到運行 Kestrel 服務器的后端 ASP.NET Core 應用,稱為進程外托管模型。
在進程內托管時,該模塊會使用 IIS 進程內服務器實現,即IISHttpServer。在進程外托管時,該模塊僅適用于 Kestrel。 該模塊與 HTTP.sys 不兼容。關于IIS 在 Windows 上托管 ASP.NET Core。安裝ASP.NET Core Model,在 "asp.net core 系列 9 環境" 中有介紹。
--發布到iis上的配置節點 <handlers><add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" /></handlers>?
二. ?windows平臺web服務器介紹
在windows平臺下,asp.net core有以下幾種HTTP 服務器組件:
(1) Kestrel服務器是默認跨平臺 HTTP 服務器實現。
(2) IISHttpServer 是IIS 的進程內服務器。
(3) HTTP.sys 服務器是僅用于 Windows 的 HTTP 服務器,它基于 HTTP.sys 核心驅動程序和 HTTP 服務器 API。
當使用 IIS 或 IIS Express 時,應用程序會在以下其中一個進程中運行:
(1) 在IIS工作進程(進程內宿主模型)與IIS HTTP服務器的相同進程中。推薦配置為In-process(用于windows上進程內托管)。
(2) 獨立于IIS工作進程(進程外宿主模型)的進程中使用Kestrel服務器。配置為OutOfProcess
?
1.1? 進程內托管模型 In-process hosting model
使用進程內宿主,ASP.NET Core應用程序運行在與其IIS worker進程相同的進程中。進程內托管比進程外托管提供了更好的性能,因為請求不會通過環回適配器進行代理,環回適配器是一個網絡接口,將傳出的網絡流量返回到同一臺機器。
由?ASP.NET Core Module執行應用初始化:(1)加載CoreCLR、(2)調用 Program.Main。以及處理 IIS 本機請求的生存期。
下圖說明了 IIS、ASP.NET Core Module和進程內托管的應用之間的關系:
?ASP.NET Core Module接收本機請求,并將它傳遞給 IISHttpServer?。 IISHttpServer?將請求從本機轉換為托管的 IIS 進程內服務器實現。
IISHttpServer?處理請求之后,請求會被推送到 ASP.NET Core 中間件管道中。?中間件管道處理該請求并將其作為?HttpContext?實例傳遞給應用的邏輯(Application code)。?應用的響應傳遞回 IIS,IIS 將響應推送回發起請求的客戶端。
?
1.2 進程外托管模型 Out-of-process hosting model
因為ASP.NET Core運行在獨立于IIS工作進程的進程中, 因此該模塊負責進程管理。該模塊在第一個請求到達時啟動 ASP.NET Core 應用的進程,并在應用關閉或崩潰時重新啟動該應用。
下圖說明了 IIS、ASP.NET Core Module和進程外托管的應用之間的關系:
ASP.NET Core Module在啟動時通過環境變量指定端口,IIS 集成中間件將服務器配置為偵聽?http://localhost:{PORT}。?執行其他檢查,拒絕不是來自該ASP.NET Core Module的請求。
Kestrel 從ASP.NET Core Module獲取請求后,請求會被推送到 ASP.NET Core 中間件管道中。?中間件管道處理該請求并將其作為?HttpContext?實例傳遞給應用的邏輯(Application code)。?IIS 集成添加的中間件會將方案、遠程 IP 和 pathbase 更新到帳戶以將請求轉發到 Kestrel。?應用的響應傳遞回 IIS,IIS 將響應推送回發起請求的 HTTP 客戶端。
最后對于非windows平臺, asp.net core使用Kestrel ?Web服務器。這是默認跨平臺 HTTP 服務器實現。
?
二.?? Kestrel 服務器
Kestrel 是 ASP.NET Core 項目模板中包括的默認 Web 服務器。默認情況下,ASP.NET Core 項目模板使用 Kestrel。 在 Program.cs 中,模板代碼調用 CreateDefaultBuilder,后者在后臺調用 UseKestrel。Kestrel 的使用方式如下:
(1) 它本身就是一個邊緣服務器,直接處理來自網絡(包括Internet)的請求。
(2) 與反向代理服務器(如 Internet Information Services (IIS)、Nginx 或 Apache)結合使用。 反向代理服務器接收來自 Internet 的 HTTP 請求,并將這些請求轉發到 Kestrel。
?
三. IISHTTPServer 服務器
? IISHTTPServer是 IIS 的進程內服務器且為進程內部署所必需。 ASP.NET Core Module 用于處理 IIS 和 IISHTTPServer之間的本機 IIS 請求。
若要配置用于進程內托管的應用,請將?<AspNetCoreHostingModel>?屬性添加到值為?InProcess(進程外托管使用?OutOfProcess?進行設置)的應用項目文件。如果文件中不存在?<AspNetCoreHostingModel>?屬性,則默認值為?OutOfProcess
<PropertyGroup><AspNetCoreHostingModel>InProcess</AspNetCoreHostingModel></PropertyGroup>InProcess時使用 IIS HTTP 服務器 (IISHttpServer) 而不是 Kestrel 服務器。OutOfProcess時使用 Kestrel 服務器,而不是 IIS HTTP 服務器 (IISHttpServer)
?
四. HTTP.sys服務器
? ? ? ? ?如果 ASP.NET Core 應用在 Windows 上運行,則 HTTP.sys 是 Kestrel 的替代選項。為了獲得最佳性能,通常建議使用 Kestrel。?在應用向 Internet 公開且所需功能受 HTTP.sys(而不是 Kestrel)支持的方案中,可以使用 HTTP.sys。
配置 ASP.NET Core 應用以使用 HTTP.sys。構建 Web 主機時調用 UseHttpSys 擴展方法,同時指定所需的 HTTP.sys 選項。在 Visual Studio 中,默認啟動配置文件是針對 IIS Express 的。?若要作為控制臺應用運行該項目,請手動更改所選配置文件。
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 | 操作系統: Windows Server 2016/Windows 10 或更高版本 具有 OpenSSL 1.0.2 或更高版本的 Linux macOS 的未來版本將支持 HTTP/2 | 目標框架: .NET Core 2.2 或更高版本 |
| HTTP.sys | 操作系統: Windows Server 2016/Windows 10 或更高版本 | 目標框架: 不適用于 HTTP.sys部署。 |
| IIS(進程內) | 操作系統: Windows Serve IIS 10 或更高版本 IIS 10 或更高版本 | 目標框架: .NET Core 2.2 或更高版本 |
| IIS(進程外) | 操作系統: Windows Serve IIS 10 或更高版本 IIS 10 或更高版本 面向公眾的邊緣服務器連接使用 HTTP/2,但與 Kestrel 的反向代理連接使用 HTTP/1.1。 | 目標框架: 不適用于 IIS 進程外部署。 |
?
總結:
(1) ASP.NET Core Module模塊是適應于windows平臺上的iis。
(2) 進程內托管模型是使用 IISHttpServer是適應于windows平臺上 IIS 的進程內服務器,。將ASP.NET Core Module接收的請求轉換為托管的 IIS 進程內服務器實現。用IISHttpServer服務器。
(3) 進程外托管模型是獨立于iis, 可以做反向代理,?用Kestrel 服務器,可以應用在windows或linux平臺上。
(4) 如果 ASP.NET Core 應用在 Windows 上運行,則 HTTP.sys 是 Kestrel 的替代選項。為了獲得最佳性能,通常建議使用 Kestrel。?
(5) Kestrel 是 ASP.NET Core 項目模板中默認 Web 服務器.可以結合反向代理服務器一起使用(如 Internet Information Services (IIS)、Nginx 或 Apache)。
?
?
參考文獻:
ASP.NET Core 中的 Kestrel Web 服務器參數設置
https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/servers/kestrel?view=aspnetcore-2.2
ASP.NET Core 中的 HTTP.sys Web 服務器參數設置
https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/servers/httpsys?view=aspnetcore-2.2
關于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
關于Linux 上 .NET Core 的先決條件
https://docs.microsoft.com/zh-cn/dotnet/core/linux-prerequisites?tabs=netcore2x
?
轉載于:https://www.cnblogs.com/MrHSR/p/10324110.html
總結
以上是生活随笔為你收集整理的asp.net core 系列 18 web服务器实现的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 前端开发-日常开发沉淀之生产环境与开发环
- 下一篇: 中国汽车产销量负增长 工信部:不见得是坏