ASP.NET Core 中的網頁伺服器實作

Tom DykstraSteve SmithStephen HalterChris Ross 提供

ASP.NET Core 應用程式執行時,需使用內含式 HTTP 伺服器實作。 伺服器實作會接聽 HTTP 要求,並以組成 HttpContext 的一組要求功能形式向應用程式呈現。

ASP.NET Core 隨附下列項目:

使用 IISIIS Express 時,應用程式可能會執行於:

ASP.NET Core 模組是一種原生 iis 模組,可處理 iis 與同進程 iis HTTP 伺服器或之間的原生 iis 要求 Kestrel 。 如需詳細資訊,請參閱ASP.NET Core 模組

Kestrel 與 HTTP.sys

Kestrel 具有下列優於 HTTP.sys 的優點:

  • 更佳的效能和記憶體使用率。
  • 跨平台
  • 彈性,它是與作業系統無關的開發和修補。
  • 程式設計埠和 TLS 設定
  • 允許 PPv2 和替代傳輸等通訊協定的擴充性。

Http.Sys 會以共用核心模式元件的形式運作,kestrel 沒有下列功能:

裝載模型

使用同處理序裝載,ASP.NET Core 應用程式會在與其 IIS 工作者處理序相同的處理序中執行。 因為要求未透過回送介面卡 (將連出網路流量傳回同一部電腦的網路介面) 進行 proxy 處理,所以同處理序裝載會提供優於跨處理序裝載的效能。 IIS 透過 Windows 處理序啟用服務 (WAS) 來執行處理程序管理。

使用非同處理序代管,ASP.NET Core 應用程式可執行於與 IIS 背景工作處理序不同的處理序中,且此模組會進行處理序的管理。 此模組會在第一個要求到達時啟動 ASP.NET Core 應用程式的處理序,並在應用程式關閉或損毀時將它重新啟動。 此行為基本上與執行同處理序,並由 Windows 處理序啟用服務 (WAS) 所管理的應用程式相同。

如需詳細資訊與組態指南,請參閱下列主題:

Kestrel

Kestrel 伺服器是預設、跨平臺的 HTTP 伺服器執行。 Kestrel 提供最佳的效能和記憶體使用率,但 HTTP.sys 中並沒有一些先進的功能。 如需詳細資訊,請參閱本檔中的 Kestrel 與 HTTP.sys

使用 Kestrel :

  • 供本身當作直接從網路 (包括網際網路) 處理要求的邊緣伺服器。

    :::非 loc (Kestrel) :::直接與沒有反向 proxy 伺服器的網際網路通訊

  • 搭配「反向 Proxy 伺服器」使用,例如 Internet Information Services (IIS)NginxApache。 反向 proxy 伺服器會從網際網路接收 HTTP 要求,並將其轉送至 Kestrel 。

    :::非 loc (Kestrel) :::透過反向 proxy 伺服器(例如 IIS、Nginx 或 Apache)間接與網際網路通訊

支援裝載設定 — ,不論是否使用反向 proxy 伺服器 — 。

如需有關 Kestrel 如何在反向 proxy 設定中使用的設定指引和詳細資訊 Kestrel ,請參閱 KestrelASP.NET Core 中的 web 伺服器執行

ASP.NET Core 隨附下列項目:

使用 iisIIS Express時,應用程式會與 IIS 背景工作進程不同的進程中執行, (跨進程) 與 Kestrel 伺服器一起執行。

因為 ASP.NET Core 應用程式執行所在的處理序會與 IIS 工作者處理序分開,所以此模組會執行處理程序管理。 此模組會在第一個要求到達時啟動 ASP.NET Core 應用程式的處理序,並在應用程式關閉或損毀時將它重新啟動。 此行為基本上與執行同處理序,並由 Windows 處理序啟用服務 (WAS) 所管理的應用程式相同。

下圖說明 IIS、ASP.NET Core 模組和跨處理序裝載應用程式之間的關聯性:

ASP.NET Core 模組

要求會從 Web 到達核心模式的 HTTP.sys 驅動程式。 驅動程式會在網站設定的通訊埠上將要求路由至 IIS,此通訊埠通常是 80 (HTTP) 或 443 (HTTPS)。 模組會將要求轉送到 Kestrel 應用程式的隨機埠,而不是埠80或443。

模組會在啟動時透過環境變數指定埠,而 IIS 整合中介軟體 會設定要接聽的伺服器 http://localhost:{port} 。 將會執行額外檢查,不是源自模組的要求都會遭到拒絕。 此模組不支援 HTTPS 轉送,因此即使由 IIS 透過 HTTPS 接收,要求還是會透過 HTTP 轉送。

Kestrel從模組挑選要求之後,會將要求推送至 ASP.NET Core 中介軟體管線。 中介軟體管線會處理要求,並將其作為 HttpContext 執行個體傳遞至應用程式的邏輯。 IIS 整合所新增的中介軟體會更新配置、遠端 IP 和 pathbase,以將要求轉送至其中的帳戶 Kestrel 。 應用程式的回應會傳回 IIS,而 IIS 會將其推送回起始要求的 HTTP 用戶端。

如需 IIS 和 ASP.NET Core 模組的設定指南,請參閱下列主題:

Nginx Kestrel

如需如何在 Linux 上使用 Nginx 作為反向 proxy 伺服器的詳細資訊 Kestrel ,請參閱 在 Linux 上使用 Nginx 裝載 ASP.NET Core

Apache with Kestrel

如需如何在 Linux 上使用 Apache 作為反向 proxy 伺服器的詳細資訊 Kestrel ,請參閱 在 Linux 上使用 Apache 裝載 ASP.NET Core

HTTP.sys

如果 ASP.NET Core 應用程式是在 Windows 上執行,HTTP.sys 是的替代方案 Kestrel 。 Kestrel 除非應用程式需要中未提供的功能,否則建議使用於 HTTP.sys Kestrel 。 如需詳細資訊,請參閱ASP.NET Core 中的 HTTP.sys 網頁伺服器實作

HTTP.sys 直接與網際網路通訊

HTTP.sys 也可用於只公開到內部網路的應用程式。

HTTP.sys 直接與內部網路通訊

如需 HTTP.sys 設定指南,請參閱 ASP.NET Core 中的 HTTP.sys 網頁伺服器實作

ASP.NET Core 伺服器基礎結構

Startup.Configure 方法提供的 IApplicationBuilder 會公開類型IFeatureCollectionServerFeatures 屬性。 Kestrel HTTP.sys 只會公開單一功能, IServerAddressesFeature 但不同的伺服器執行可能會公開其他的功能。

IServerAddressesFeature 可用來找出伺服器實作在執行階段已繫結的連接埠。

自訂伺服器

如果內建伺服器不符合應用程式的需求,則可以建立自訂伺服器實作。 Open Web Interface for .NET (OWIN) 指南示範如何撰寫採用 NowinIServer 實作。 只有該應用程式使用的功能介面才需要實作,但至少須支援 IHttpRequestFeatureIHttpResponseFeature

伺服器啟動

伺服器會在整合式開發環境 (IDE) 或編輯器啟動應用程式時啟動:

從專案資料夾中的命令提示字元啟動應用程式時, dotnet 回合會啟動應用程式和伺服器 (Kestrel ,且僅 HTTP.sys) 。 組態是由 -c|--configuration 選項指定,會設為 Debug (預設值) 或 Release

當使用或工具內建的偵錯工具(例如 Visual Studio)來啟動應用程式時,檔案 上的launchSettings.js 會提供設定 dotnet run 。 如果啟動設定檔存在於檔案的 launchSettings.js 中,請使用 --launch-profile {PROFILE NAME} 選項搭配 dotnet run 命令或選取 Visual Studio 中的設定檔。 如需詳細資訊,請參閱 dotnet run.NET Core 發佈封裝

HTTP/2 支援

在下列部署案例中,ASP.NET Core 支援 HTTP/2

  • Kestrel
    • 作業系統
      • Windows Server 2016/Windows 10 或更新版本†
      • Linux 含 OpenSSL 1.0.2 或更新版本 (例如 Ubuntu 16.04 或更新版本)
      • 未來版本的 macOS 將會支援 HTTP/2。
    • 目標 Framework:.NET Core 2.2 或更新版本
  • HTTP.sys
    • Windows Server 2016/Windows 10 或更新版本
    • 目標 Framework:不適用於 HTTP.sys 部署。
  • IIS (同處理序)
    • Windows Server 2016/Windows 10 或更新版本;IIS 10 或更新版本
    • 目標 Framework:.NET Core 2.2 或更新版本
  • IIS (跨處理序)
    • Windows Server 2016/Windows 10 或更新版本;IIS 10 或更新版本
    • 公眾對應的 edge server 連線使用 HTTP/2,但反向 proxy 連線 Kestrel 使用 HTTP/1.1。
    • 目標 Framework:不適用於 IIS 跨處理序部署。

†KestrelWindows Server 2012 R2 和 Windows 8.1 對 HTTP/2 的支援有限。 支援有限的原因是這些作業系統上的支援 TLS 密碼編譯套件清單有限。 可能需要使用橢圓曲線數位簽章演算法 (ECDSA) 產生的憑證來保護 TLS 連線。

  • Kestrel
    • 作業系統
      • Windows Server 2016/Windows 10 或更新版本†
      • Linux 含 OpenSSL 1.0.2 或更新版本 (例如 Ubuntu 16.04 或更新版本)
      • 未來版本的 macOS 將會支援 HTTP/2。
    • 目標 Framework:.NET Core 2.2 或更新版本
  • HTTP.sys
    • Windows Server 2016/Windows 10 或更新版本
    • 目標 Framework:不適用於 HTTP.sys 部署。
  • IIS (同處理序)
    • Windows Server 2016/Windows 10 或更新版本;IIS 10 或更新版本
    • 目標 Framework:.NET Core 2.2 或更新版本
  • IIS (跨處理序)
    • Windows Server 2016/Windows 10 或更新版本;IIS 10 或更新版本
    • 公眾對應的 edge server 連線使用 HTTP/2,但反向 proxy 連線 Kestrel 使用 HTTP/1.1。
    • 目標 Framework:不適用於 IIS 跨處理序部署。

†KestrelWindows Server 2012 R2 和 Windows 8.1 對 HTTP/2 的支援有限。 支援有限的原因是這些作業系統上的支援 TLS 密碼編譯套件清單有限。 可能需要使用橢圓曲線數位簽章演算法 (ECDSA) 產生的憑證來保護 TLS 連線。

  • HTTP.sys
    • Windows Server 2016/Windows 10 或更新版本
    • 目標 Framework:不適用於 HTTP.sys 部署。
  • IIS (跨處理序)
    • Windows Server 2016/Windows 10 或更新版本;IIS 10 或更新版本
    • 公眾對應的 edge server 連線使用 HTTP/2,但反向 proxy 連線 Kestrel 使用 HTTP/1.1。
    • 目標 Framework:不適用於 IIS 跨處理序部署。

HTTP/2 連線必須使用 Application-Layer Protocol Negotiation (ALPN) 和 TLS 1.2 或更新版本。 如需詳細資訊,請參閱與伺服器部署案例相關的主題。

其他資源