ASP.NET Core 2.2 基礎知識(十三)【伺服器】

風靈使發表於2019-02-20

ASP.NET Core 中的 Web 伺服器實現

ASP.NET Core 應用與程式內 HTTP 伺服器實現一起執行。 該伺服器實現偵聽 HTTP 請求,並以組成 HttpContext請求功能集形式,將它們呈現給應用。

Windows
ASP.NET Core 隨附以下元件:

  • Kestrel 伺服器是預設跨平臺 HTTP 伺服器實現。
  • IIS HTTP 伺服器是 IIS 的程式內伺服器
  • HTTP.sys 伺服器是僅用於 Windows 的 HTTP 伺服器,它基於 HTTP.sys 核心驅動程式和 HTTP 伺服器 API

使用 IISIIS Express 時,應用會在以下其中一個程式中執行:

  • 在與 IIS 工作程式(程式內託管模型)和 IIS HTTP 伺服器相同的程式中。 “程式內”建議的配置。
  • 在獨立於 IIS 工作程式(程式外託管模型)和 Kestrel 伺服器的程式中。

ASP.NET Core 模組是本機 IIS 模組,用於處理 IIS 和程式內 IIS HTTP 伺服器或 Kestrel 之間的本機 IIS 請求。 有關更多資訊,請參見ASP.NET Core 模組

託管模型

程式內託管模型

使用程式內託管,ASP.NET Core 在與其 IIS 工作程式相同的程式中執行。 程式內承載相較程式外承載提供更優的效能,因為請求並不通過環回介面卡進行代理,環回介面卡是一個網路介面,用於將傳出的網路流量返回給同一計算機。 IIS 使用 Windows 程式啟用服務 (WAS) 處理程式管理。

ASP.NET Core 模組:

  • 執行應用初始化。
    • 載入 CoreCLR
    • 呼叫 Program.Main
  • 處理 IIS 本機請求的生存期。

定目標到 .NET Framework 的 ASP.NET Core 應用不支援程式內託管模型。

下圖說明了 IIS、ASP.NET Core 模組和程式內託管的應用之間的關係:
在這裡插入圖片描述

請求從 Web 到達核心模式 HTTP.sys 驅動程式。 驅動程式將本機請求路由到網站的配置埠上的 IIS,通常為 80 (HTTP) 或 443 (HTTPS)。 該模組接收本機請求,並將它傳遞給 IIS HTTP 伺服器 (IISHttpServer)。 IIS HTTP 伺服器是將請求從本機轉換為託管的 IIS 程式內伺服器實現。

IIS HTTP 伺服器處理請求之後,請求會被推送到 ASP.NET Core 中介軟體管道中。 中介軟體管道處理該請求並將其作為 HttpContext 例項傳遞給應用的邏輯。 應用的響應傳遞迴 IIS,IIS 將響應推送回發起請求的客戶端。

程式內託管選擇使用現有應用,但 dotnet new 模板預設使用所有 IIS 和 IIS Express 方案的程式內託管模型。

程式外託管模型

由於 ASP.NET Core 應用在獨立於 IIS 工作程式的程式中執行,因此該模組會處理程式管理。 該模組在第一個請求到達時啟動 ASP.NET Core 應用的程式,並在應用關閉或崩潰時重新啟動該應用。 這基本上與在 Windows 程式啟用服務 (WAS) 託管的程式內執行的應用中出現的行為相同。

下圖說明了 IIS、ASP.NET Core 模組和程式外託管的應用之間的關係:
在這裡插入圖片描述
請求從 Web 到達核心模式 HTTP.sys 驅動程式。 驅動程式將請求路由到網站的配置埠上的 IIS,通常為 80 (HTTP) 或 443 (HTTPS)。 該模組將該請求轉發到應用的隨機埠(非埠 80/443)上的 Kestrel

該模組在啟動時通過環境變數指定埠,IIS 整合中介軟體將伺服器配置為偵聽 http://localhost:{PORT}。 執行其他檢查,拒絕不是來自該模組的請求。 該模組不支援 HTTPS 轉發,因此即使請求由 IIS 通過 HTTPS 接收,它們還是通過 HTTP 轉發。

Kestrel 從模組獲取請求後,請求會被推送到 ASP.NET Core 中介軟體管道中。 中介軟體管道處理該請求並將其作為 HttpContext 例項傳遞給應用的邏輯。 IIS 整合新增的中介軟體會將方案、遠端 IP 和 pathbase 更新到帳戶以將請求轉發到 Kestrel。 應用的響應傳遞迴 IIS,IIS 將響應推送回發起請求的 HTTP 客戶端。

有關 IIS 和 ASP.NET Core 模組的配置指南,請參閱以下主題:

  • 使用 IIS 在 Windows 上託管 ASP.NET Core
  • ASP.NET Core 模組

Kestrel

KestrelASP.NET Core 專案模板中包括的預設 Web 伺服器。

Kestrel 的使用方式如下:

  • 本身作為邊緣伺服器,處理直接來自網路(包括 Internet)的請求。

Kestrel 直接與 Internet 通訊,不使用反向代理伺服器

Kestrel 通過反向代理伺服器(如 IIS、Nginx 或 Apache)間接與 Internet 進行通訊
使用或不使用反向代理伺服器對 ASP.NET Core 2.1 或更高版本的應用來說都是受支援的託管配置。

有關 Kestrel 配置指南和何時在反向代理配置中使用 Kestrel 的資訊,請參閱 ASP.NET Core 中的 Kestrel Web 伺服器實現

NginxKestrel

若要了解如何在 Linux 上使用 Nginx 作為 Kestrel 的反向代理伺服器,請參閱 使用 Nginx 在 Linux 上託管 ASP.NET Core

ApacheKestrel

若要了解如何在 Linux 上使用 Apache 作為 Kestrel 的反向代理伺服器,請參閱 使用 Apache 在 Linux 上託管 ASP.NET Core

IIS HTTP 伺服器

IIS HTTP 伺服器是 IIS 的程式內伺服器且為程式內部署所必需。 ASP.NET Core 模組用於處理 IIS 和 IIS HTTP 伺服器之間的本機 IIS 請求。 有關更多資訊,請參見ASP.NET Core 模組

HTTP.sys

如果 ASP.NET Core 應用在 Windows 上執行,則 HTTP.sysKestrel 的替代選項。 為了獲得最佳效能,通常建議使用 Kestrel。 在應用向 Internet 公開且所需功能受 HTTP.sys(而不是 Kestrel)支援的方案中,可以使用 HTTP.sys。 有關更多資訊,請參見ASP.NET Core 中的 HTTP.sys Web 伺服器實現
HTTP.sys 直接與 Internet 進行通訊

對於僅向內部網路公開的應用,HTTP.sys 同樣適用。
HTTP.sys 直接與內部網路進行通訊
有關 HTTP.sys 的配置指南,請參閱 ASP.NET Core 中的 HTTP.sys Web 伺服器實現

ASP.NET Core 伺服器基礎結構

Startup.Configure 方法中提供的 IApplicationBuilder 公開了型別 IFeatureCollectionServerFeatures屬性。 KestrelHTTP.sys 各自僅公開單個功能,即 IServerAddressesFeature,但是不同的伺服器實現可能公開其他功能。

IServerAddressesFeature 可用於查詢伺服器實現在執行時繫結的埠。

自定義伺服器

如果內建伺服器無法滿足應用需求,可以建立一個自定義伺服器實現。 .NET 的開放 Web 介面 (OWIN) 指南 演示瞭如何編寫基於 NowinIServer實現。 只有應用使用的功能介面需要實現,但至少必須支援IHttpRequestFeatureIHttpResponseFeature

伺服器啟動

整合開發環境 (IDE) 或編輯器啟動以下應用時,會啟動伺服器:

從專案資料夾中的命令提示符啟動應用時,dotnet run 會啟動該應用和伺服器(僅 KestrelHTTP.sys)。 可通過 -c|--configuration 選項指定此配置,該選項設定為 Debug(預設值)或 Release。 如果啟動配置檔案位於 launchSettings.json 檔案中,請使用 --launch-profile <NAME> 選項設定啟動配置檔案(例如 DevelopmentProduction)。 有關詳細資訊,請參閱 dotnet run.NET Core 分發打包

HTTP/2 支援

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

  • Kestrel
    • 作業系統
      • Windows Server 2016/Windows 10 或更高版本†
      • 具有 OpenSSL 1.0.2 或更高版本的 Linux(例如,Ubuntu 16.04 或更高版本)
      • macOS 的未來版本將支援 HTTP/2。
    • 目標框架:.NET Core 2.2 或更高版本
  • HTTP.sys
    • Windows Server 2016/Windows 10 或更高版本
    • 目標框架:不適用於 HTTP.sys 部署。
  • IIS(程式內)
    • Windows Server 2016/Windows 10 或更高版本;IIS 10 或更高版本
    • 目標框架:.NET Core 2.2 或更高版本
  • IIS(程式外)
    • Windows Server 2016/Windows 10 或更高版本;IIS 10 或更高版本
    • 面向公眾的邊緣伺服器連線使用 HTTP/2,但與 Kestrel 的反向代理連線使用 HTTP/1.1
    • 目標框架:不適用於 IIS 程式外部署。

KestrelWindows Server 2012 R2Windows 8.1 上對 HTTP/2 的支援有限。 支援受限是因為可在這些作業系統上使用的受支援 TLS 密碼套件列表有限。可能需要使用橢圓曲線數字簽名演算法 (ECDSA) 生成的證書來保護 TLS 連線。

HTTP/2 連線必須使用應用程式層協議協商 (ALPN)TLS 1.2 或更高版本。 有關詳細資訊,請參閱與伺服器部署方案相關的主題。

相關文章