asp.net core 系列 18 web服務(wù)器實(shí)現(xiàn)

一. ASP.NET Core Module

在介紹ASP.NET Core Web實(shí)現(xiàn)之前,先來了解下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>
image

二. 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ì)通過環(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)求的生存期。
下圖說明了 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)用。
下圖說明了 IIS、ASP.NET Core Module和進(jìn)程外托管的應(yīng)用之間的關(guān)系:


ASP.NET Core Module在啟動(dòng)時(shí)通過環(huán)境變量指定端口,IIS 集成中間件將服務(wù)器配置為偵聽 http://localhost:{PORT}。 執(zhí)行其他檢查,拒絕不是來自該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ù)器,直接處理來自網(wǎng)絡(luò)(包括Internet)的請(qǐng)求。



(2) 與反向代理服務(wù)器(如 Internet Information Services (IIS)、Nginx 或 Apache)結(jié)合使用。 反向代理服務(wù)器接收來自 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 公開且所需功能受 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

image
服務(wù)器 操作系統(tǒng) 目標(biāo)框架
Kestrel 操作系統(tǒng):Windows Server 2016/Windows 10 或更高版本,具有 OpenSSL 1.0.2 或更高版本的 Linux,macOS 的未來版本將支持 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)) Windows Serve IIS 10 或更高版本IIS 10 或更高版本 .NET Core 2.2 或更高版本
IIS(進(jìn)程外) Windows Serve IIS 10 或更高版本,IIS 10 或更高版本,面向公眾的邊緣服務(wù)器連接使用 HTTP/2,但與 Kestrel 的反向代理連接使用 HTTP/1.1。 不適用于 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

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容