1. 程式人生 > >ASP.NET Core 2.2 基礎知識(十一) ASP.NET Core 模組

ASP.NET Core 2.2 基礎知識(十一) ASP.NET Core 模組

原文: ASP.NET Core 2.2 基礎知識(十一) ASP.NET Core 模組

ASP.NET Core 應用與程序內的 HTTP 伺服器實現一起執行.該伺服器實現偵聽 HTTP 請求,並在一系列請求功能被寫到 HttpContext 時,將這些請求展現到應用中.

ASP.NET Core 隨附兩種伺服器實現:

  • Kestrel 是適用於 ASP.NET Core 的預設跨平臺 HTTP 伺服器.
  • HTTP.sys 是僅適用於 Windows 的 HTTP 伺服器,它基於 HTTP.sys 核心驅動程式和 HTTP 伺服器 API.在 ASP.NET 1.x 中被命名為 WebListener.

ASP.NET Core 模組是本機 IIS 模組,用於處理 IIS 和程序內 IIS HTTP 伺服器(HTTP.sys)或 Kestrel 之間的本機 IIS 請求。

使用 IIS 或 IIS Express 時,應用會在以下其中一個程序中執行:

  • 在與 IIS 工作程序(程序內託管模型)和 IIS HTTP 伺服器相同的程序中.
  • 在獨立於 IIS 工作程序(程序外託管模型)和 Kestrel 伺服器的程序中.

託管模型

程序內託管模型

使用程序內託管,ASP.NET Core 在與其 IIS 工作程序相同的程序中執行。 這樣可消除通過環回介面卡代理請求時的程序外效能損失,環回介面卡是一個網路介面,用於將傳出的網路流量返回給同一計算機。 IIS 使用 Windows 程序啟用服務 (WAS) 處理程序管理。

ASP.NET Core 模組:

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

下圖說明了 IIS、ASP.NET Core 模組和程序內託管的應用之間的關係:

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 模組和程序外託管的應用之間的關係:

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 客戶端。

ASP.NET Core 模組具有一些其他功能。 該模組可以:

  • 為工作程序設定環境變數。
  • 將 stdout 輸出記錄到檔案儲存器,以解決啟動問題。
  • 轉發 Windows 身份驗證令牌。