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 模塊和進程內托管的應用之間的關系:
請求從 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 客戶端。
ASP.NET Core 模塊具有一些其他功能。 該模塊可以:
- 為工作進程設置環境變量。
- 將 stdout 輸出記錄到文件存儲器,以解決啟動問題。
- 轉發 Windows 身份驗證令牌。
ASP.NET Core 2.2 基礎知識(十一) ASP.NET Core 模塊