ASP.NET Core 2.2 基礎知識(十三)【伺服器】
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
。
使用 IIS
或 IIS 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
Kestrel
是 ASP.NET Core 專案模板中包括的預設 Web 伺服器。
Kestrel 的使用方式如下:
- 本身作為邊緣伺服器,處理直接來自網路(包括 Internet)的請求。
- 與反向代理伺服器(如 Internet Information Services (IIS)、Nginx 或 Apache)結合使用。 反向代理伺服器接收來自 Internet 的 HTTP 請求,並將這些請求轉發到 Kestrel。
使用或不使用反向代理伺服器對 ASP.NET Core 2.1
或更高版本的應用來說都是受支援的託管配置。
有關 Kestrel
配置指南和何時在反向代理配置中使用 Kestrel
的資訊,請參閱 ASP.NET Core 中的 Kestrel Web 伺服器實現
。
Nginx
與 Kestrel
若要了解如何在 Linux 上使用 Nginx
作為 Kestrel
的反向代理伺服器,請參閱 使用 Nginx 在 Linux 上託管 ASP.NET Core
。
Apache
與 Kestrel
若要了解如何在 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.sys
是 Kestrel
的替代選項。 為了獲得最佳效能,通常建議使用 Kestrel。 在應用向 Internet 公開且所需功能受 HTTP.sys
(而不是 Kestrel)支援的方案中,可以使用 HTTP.sys
。 有關更多資訊,請參見ASP.NET Core 中的 HTTP.sys Web 伺服器實現
。
對於僅向內部網路公開的應用,HTTP.sys 同樣適用。
有關 HTTP.sys
的配置指南,請參閱 ASP.NET Core 中的 HTTP.sys Web 伺服器實現
。
ASP.NET Core 伺服器基礎結構
Startup.Configure
方法中提供的 IApplicationBuilder
公開了型別 IFeatureCollection
的 ServerFeatures
屬性。 Kestrel
和 HTTP.sys
各自僅公開單個功能,即 IServerAddressesFeature
,但是不同的伺服器實現可能公開其他功能。
IServerAddressesFeature
可用於查詢伺服器實現在執行時繫結的埠。
自定義伺服器
如果內建伺服器無法滿足應用需求,可以建立一個自定義伺服器實現。 .NET 的開放 Web 介面 (OWIN) 指南
演示瞭如何編寫基於 Nowin
的 IServer
實現。 只有應用使用的功能介面需要實現,但至少必須支援IHttpRequestFeature
和 IHttpResponseFeature
。
伺服器啟動
整合開發環境 (IDE) 或編輯器啟動以下應用時,會啟動伺服器:
- Visual Studio – 可使用啟動配置檔案通過
IIS Express
/ASP.NET Core 模組
或控制檯來啟動應用和伺服器。 - Visual Studio Code – 由Omnisharp 通過啟用
CoreCLR
除錯程式來啟動應用和伺服器。 - Visual Studio for Mac – 由 Mono Soft-Mode Debugger 啟動應用和伺服器。
從專案資料夾中的命令提示符啟動應用時,dotnet run
會啟動該應用和伺服器(僅 Kestrel
和 HTTP.sys
)。 可通過 -c|--configuration
選項指定此配置,該選項設定為 Debug
(預設值)或 Release
。 如果啟動配置檔案位於 launchSettings.json 檔案中,請使用 --launch-profile <NAME>
選項設定啟動配置檔案(例如 Development
或 Production
)。 有關詳細資訊,請參閱 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 程式外部署。
Kestrel
在 Windows Server 2012 R2
和 Windows 8.1
上對 HTTP/2
的支援有限。 支援受限是因為可在這些作業系統上使用的受支援 TLS
密碼套件列表有限。可能需要使用橢圓曲線數字簽名演算法 (ECDSA
) 生成的證書來保護 TLS
連線。
HTTP/2
連線必須使用應用程式層協議協商 (ALPN) 和 TLS 1.2
或更高版本。 有關詳細資訊,請參閱與伺服器部署方案相關的主題。
相關文章
- ASP.NET Core 2.2 基礎知識(七)【選項】ASP.NET
- ASP.NET Core 2.2 基礎知識(十)【中介軟體】ASP.NET
- ASP.NET Core 2.2 基礎知識(六)【Configuration】ASP.NET
- ASP.NET Core 2.2 基礎知識(八)【日誌記錄】ASP.NET
- ASP.NET Core 2.2 基礎知識(九)【處理錯誤】ASP.NET
- ASP.NET Core基礎知識(四)【路由】ASP.NET路由
- ASP.NET Core基礎知識(一)【概述】ASP.NET
- ASP.NET Core基礎知識(二)【應用啟動】ASP.NET
- ASP.NET Core基礎知識(十一)【Host之Web 主機】ASP.NETWeb
- ASP.NET Core基礎知識(十四)【發出 HTTP 請求】ASP.NETHTTP
- ASP.NET Core 基礎知識(十二)【Host之通用主機】ASP.NET
- 伺服器基礎知識伺服器
- ASP.NET Core基礎知識(三)【依賴關係注入(服務)】ASP.NET
- ASP.NET程式安全的基礎知識ASP.NET
- ASP.NET Core基礎知識(五)【環境(開發、分階段、生產)】ASP.NET
- 【知識分享】 伺服器基礎知識【初學者必看】伺服器
- ASP.NET core 2.2 截圖ASP.NET
- 小范筆記:ASP.NET Core API 基礎知識與Axios前端提交資料筆記ASP.NETAPIiOS前端
- 學習Java基礎知識,打通面試關~十三鎖機制Java面試
- 基礎知識
- 使用ASP.NET Core開發GraphQL伺服器 -- 預備知識(下)ASP.NET伺服器
- 使用ASP.NET Core開發GraphQL伺服器 -- 預備知識(上)ASP.NET伺服器
- 伺服器的基礎軟硬體知識伺服器
- 郵件伺服器的基礎知識概述伺服器
- 一文了解.Net Core 3.1 Web API基礎知識WebAPI
- AI 基礎知識AI
- Webpack 基礎知識Web
- Dart基礎知識Dart
- RabbitMQ基礎知識MQ
- webpack基礎知識Web
- javascript基礎知識JavaScript
- ThinkPHP基礎知識PHP
- Laravel基礎知識Laravel
- Redis基礎知識Redis
- Docker基礎知識Docker
- 程式基礎知識
- Envoy基礎知識
- DockerFile基礎知識Docker