ASP.NET Core 中的 Web 服務(wù)器實現(xiàn)

2019-04-17 08:58 更新

ASP.NET Core 應(yīng)用與進程內(nèi) HTTP 服務(wù)器實現(xiàn)一起運行。 該服務(wù)器實現(xiàn)偵聽 HTTP 請求,并以組成 HttpContext 的請求功能集形式,將它們呈現(xiàn)給應(yīng)用。

ASP.NET Core 隨附以下組件:

使用 IIS 或 IIS Express 時,應(yīng)用會在以下其中一個進程中運行:

ASP.NET Core 模塊是本機 IIS 模塊,用于處理 IIS 和進程內(nèi) IIS HTTP 服務(wù)器或 Kestrel 之間的本機 IIS 請求。 有關(guān)更多信息,請參見ASP.NET Core 模塊

托管模型

進程內(nèi)托管模型

使用進程內(nèi)托管,ASP.NET Core 在與其 IIS 工作進程相同的進程中運行。 進程內(nèi)承載相較進程外承載提供更優(yōu)的性能,因為請求并不通過環(huán)回適配器進行代理,環(huán)回適配器是一個網(wǎng)絡(luò)接口,用于將傳出的網(wǎng)絡(luò)流量返回給同一計算機。 IIS 使用 Windows 進程激活服務(wù) (WAS) 處理進程管理。

ASP.NET Core 模塊:

  • 執(zhí)行應(yīng)用初始化。
    • 加載 CoreCLR。
    • 調(diào)用 Program.Main
  • 處理 IIS 本機請求的生存期。

定目標到 .NET Framework 的 ASP.NET Core 應(yīng)用不支持進程內(nèi)托管模型。

下圖說明了 IIS、ASP.NET Core 模塊和進程內(nèi)托管的應(yīng)用之間的關(guān)系:

ASP.NET Core 模塊

請求從 Web 到達內(nèi)核模式 HTTP.sys 驅(qū)動程序。 驅(qū)動程序?qū)⒈緳C請求路由到網(wǎng)站的配置端口上的 IIS,通常為 80 (HTTP) 或 443 (HTTPS)。 該模塊接收本機請求,并將它傳遞給 IIS HTTP 服務(wù)器 (IISHttpServer)。 IIS HTTP 服務(wù)器是將請求從本機轉(zhuǎn)換為托管的 IIS 進程內(nèi)服務(wù)器實現(xiàn)。

IIS HTTP 服務(wù)器處理請求之后,請求會被推送到 ASP.NET Core 中間件管道中。 中間件管道處理該請求并將其作為 HttpContext 實例傳遞給應(yīng)用的邏輯。 應(yīng)用的響應(yīng)通過 IIS HTTP 服務(wù)器傳遞回 IIS。 IIS 將響應(yīng)發(fā)送到發(fā)起請求的客戶端。

進程內(nèi)托管選擇使用現(xiàn)有應(yīng)用,但 dotnet new 模板默認使用所有 IIS 和 IIS Express 方案的進程內(nèi)托管模型。

進程外托管模型

由于 ASP.NET Core 應(yīng)用在獨立于 IIS 工作進程的進程中運行,因此該模塊會處理進程管理。 該模塊在第一個請求到達時啟動 ASP.NET Core 應(yīng)用的進程,并在應(yīng)用關(guān)閉或崩潰時重新啟動該應(yīng)用。 這基本上與在 Windows 進程激活服務(wù) (WAS) 托管的進程內(nèi)運行的應(yīng)用中出現(xiàn)的行為相同。

下圖說明了 IIS、ASP.NET Core 模塊和進程外托管的應(yīng)用之間的關(guān)系:

ASP.NET Core 模塊

請求從 Web 到達內(nèi)核模式 HTTP.sys 驅(qū)動程序。 驅(qū)動程序?qū)⒄埱舐酚傻骄W(wǎng)站的配置端口上的 IIS,通常為 80 (HTTP) 或 443 (HTTPS)。 該模塊將該請求轉(zhuǎn)發(fā)到應(yīng)用的隨機端口(非端口 80/443)上的 Kestrel。

該模塊在啟動時通過環(huán)境變量指定端口,IIS 集成中間件將服務(wù)器配置為偵聽 http://localhost:{PORT}。 執(zhí)行其他檢查,拒絕不是來自該模塊的請求。 該模塊不支持 HTTPS 轉(zhuǎn)發(fā),因此即使請求由 IIS 通過 HTTPS 接收,它們還是通過 HTTP 轉(zhuǎn)發(fā)。

Kestrel 從模塊獲取請求后,請求會被推送到 ASP.NET Core 中間件管道中。 中間件管道處理該請求并將其作為 HttpContext 實例傳遞給應(yīng)用的邏輯。 IIS 集成添加的中間件會將方案、遠程 IP 和 pathbase 更新到帳戶以將請求轉(zhuǎn)發(fā)到 Kestrel。 應(yīng)用的響應(yīng)傳遞回 IIS,IIS 將響應(yīng)推送回發(fā)起請求的 HTTP 客戶端。

有關(guān) IIS 和 ASP.NET Core 模塊的配置指南,請參閱以下主題:

Kestrel

Kestrel 是 ASP.NET Core 項目模板中包括的默認 Web 服務(wù)器。

Kestrel 的使用方式如下:

  • 本身作為邊緣服務(wù)器,處理直接來自網(wǎng)絡(luò)(包括 Internet)的請求。Kestrel 直接與 Internet 通信,不使用反向代理服務(wù)器
  • 與反向代理服務(wù)器(如 Internet Information Services (IIS)、Nginx 或 Apache)結(jié)合使用。 反向代理服務(wù)器接收來自 Internet 的 HTTP 請求,并將這些請求轉(zhuǎn)發(fā)到 Kestrel。Kestrel 通過反向代理服務(wù)器(如 IIS、Nginx 或 Apache)間接與 Internet 進行通信

使用或不使用反向代理服務(wù)器對 ASP.NET Core 2.1 或更高版本的應(yīng)用來說都是受支持的托管配置。

有關(guān) Kestrel 配置指南和何時在反向代理配置中使用 Kestrel 的信息,請參閱 ASP.NET Core 中的 Kestrel Web 服務(wù)器實現(xiàn)。

Nginx 與 Kestrel

若要了解如何在 Linux 上使用 Nginx 作為 Kestrel 的反向代理服務(wù)器,請參閱 使用 Nginx 在 Linux 上托管 ASP.NET Core。

Apache 與 Kestrel

若要了解如何在 Linux 上使用 Apache 作為 Kestrel 的反向代理服務(wù)器,請參閱 使用 Apache 在 Linux 上托管 ASP.NET Core。

IIS HTTP 服務(wù)器

IIS HTTP 服務(wù)器是 IIS 的進程內(nèi)服務(wù)器且為進程內(nèi)部署所必需。 ASP.NET Core 模塊用于處理 IIS 和 IIS HTTP 服務(wù)器之間的本機 IIS 請求。 有關(guān)更多信息,請參見ASP.NET Core 模塊。

HTTP.sys

如果 ASP.NET Core 應(yīng)用在 Windows 上運行,則 HTTP.sys 是 Kestrel 的替代選項。 為了獲得最佳性能,通常建議使用 Kestrel。 在應(yīng)用向 Internet 公開且所需功能受 HTTP.sys(而不是 Kestrel)支持的方案中,可以使用 HTTP.sys。 有關(guān)更多信息,請參見ASP.NET Core 中的 HTTP.sys Web 服務(wù)器實現(xiàn)

HTTP.sys 直接與 Internet 進行通信

對于僅向內(nèi)部網(wǎng)絡(luò)公開的應(yīng)用,HTTP.sys 同樣適用。

HTTP.sys 直接與內(nèi)部網(wǎng)絡(luò)進行通信

有關(guān) HTTP.sys 的配置指南,請參閱 ASP.NET Core 中的 HTTP.sys Web 服務(wù)器實現(xiàn)。

ASP.NET Core 服務(wù)器基礎(chǔ)結(jié)構(gòu)

Startup.Configure 方法中提供的 IApplicationBuilder 公開了類型 IFeatureCollection 的 ServerFeatures 屬性。 Kestrel 和 HTTP.sys 各自僅公開單個功能,即 IServerAddressesFeature,但是不同的服務(wù)器實現(xiàn)可能公開其他功能。

IServerAddressesFeature 可用于查找服務(wù)器實現(xiàn)在運行時綁定的端口。

自定義服務(wù)器

如果內(nèi)置服務(wù)器無法滿足應(yīng)用需求,可以創(chuàng)建一個自定義服務(wù)器實現(xiàn)。 .NET 的開放 Web 接口 (OWIN) 指南 演示了如何編寫基于 Nowin 的 IServer 實現(xiàn)。 只有應(yīng)用使用的功能接口需要實現(xiàn),但至少必須支持 IHttpRequestFeature 和 IHttpResponseFeature

服務(wù)器啟動

集成開發(fā)環(huán)境 (IDE) 或編輯器啟動以下應(yīng)用時,會啟動服務(wù)器:

從項目文件夾中的命令提示符啟動應(yīng)用時,dotnet run 會啟動該應(yīng)用和服務(wù)器(僅 Kestrel 和 HTTP.sys)。 可通過 -c|--configuration 選項指定此配置,該選項設(shè)置為 Debug(默認值)或 Release。 如果啟動配置文件位于 launchSettings.json 文件中,請使用 --launch-profile <NAME> 選項設(shè)置啟動配置文件(例如 Development 或 Production)。 有關(guān)詳細信息,請參閱 dotnet run 和 .NET Core 分發(fā)打包

HTTP/2 支持

以下部署方案中的 ASP.NET Core 支持 HTTP/2

  • Kestrel操作系統(tǒng)Windows Server 2016/Windows 10 或更高版本?具有 OpenSSL 1.0.2 或更高版本的 Linux(例如,Ubuntu 16.04 或更高版本)macOS 的未來版本將支持 HTTP/2。目標框架:.NET Core 2.2 或更高版本
  • HTTP.sysWindows Server 2016/Windows 10 或更高版本目標框架:不適用于 HTTP.sys 部署。
  • IIS(進程內(nèi))Windows Server 2016/Windows 10 或更高版本;IIS 10 或更高版本目標框架:.NET Core 2.2 或更高版本
  • IIS(進程外)Windows Server 2016/Windows 10 或更高版本;IIS 10 或更高版本面向公眾的邊緣服務(wù)器連接使用 HTTP/2,但與 Kestrel 的反向代理連接使用 HTTP/1.1。目標框架:不適用于 IIS 進程外部署。

?Kestrel 在 Windows Server 2012 R2 和 Windows 8.1 上對 HTTP/2 的支持有限。 支持受限是因為可在這些操作系統(tǒng)上使用的受支持 TLS 密碼套件列表有限。 可能需要使用橢圓曲線數(shù)字簽名算法 (ECDSA) 生成的證書來保護 TLS 連接。

HTTP/2 連接必須使用應(yīng)用程序?qū)訁f(xié)議協(xié)商 (ALPN) 和 TLS 1.2 或更高版本。 有關(guān)詳細信息,請參閱與服務(wù)器部署方案相關(guān)的主題。


以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號