搭配使用 HTTP/3 與 ASP.NET Core Kestrel Web 伺服器
注意
這不是這篇文章的最新版本。 如需目前的版本,請參閱 本文的 .NET 9 版本。
警告
不再支援此版本的 ASP.NET Core。 如需詳細資訊,請參閱 .NET 和 .NET Core 支持原則。 如需目前的版本,請參閱 本文的 .NET 9 版本。
HTTP/3 是 HTTP 的已核准標準和第三個主要版本。 本文討論 HTTP/3 的需求。 ASP.NET Core 7.0 和更新版本完全支援 HTTP/3。
重要
設定來使用 HTTP/3 的應用程式也應該支援 HTTP/1.1 和 HTTP/2。
HTTP/3 需求
根據作業系統,HTTP/3 的需求會不同。 如果正在其上執行 Kestrel 的平台沒有 HTTP/3 的所有需求,則會將其停用,而且 Kestrel 將會回復至其他 HTTP 通訊協定。
Windows
- Windows 11 組建 22000 或更新版本或是 Windows Server 2022。
- TLS 1.3 或更新版本連線。
Linux
- 已安裝
libmsquic
套件。
libmsquic
是透過位於 packages.microsoft.com
的 Microsoft 官方 Linux 套件存放庫所發行。 若要安裝此套件:
- 新增
packages.microsoft.com
存放庫。 如需指示,請參閱適用於 Microsoft 產品的 Linux 軟體存放庫。 - 使用散發套件的套件管理員來安裝
libmsquic
套件。 例如,Ubuntu 上的apt install libmsquic=1.9*
。
附註:.NET 6 只與 1.9.x 版的 libmsquic 相容。 Libmsquic 2.x 因中斷性變更而不相容。 Libmsquic 會在需要時收到 1.9.x 的更新,以納入安全性修正程式。
macOS
macOS 目前不支援 HTTP/3,未來版本則可能會提供。
開始使用
預設不會啟用 HTTP/3。 將設定新增至 Program.cs
,以啟用 HTTP/3。
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, options) =>
{
options.ListenAnyIP(5001, listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
listenOptions.UseHttps();
});
});
上述程式碼會將連接埠 5001 設定為:
- 指定
HttpProtocols.Http1AndHttp2AndHttp3
,以搭配使用 HTTP/3 與 HTTP/1.1 和 HTTP/2。 - 使用
UseHttps
來啟用 HTTPS。 HTTP/3 需要 HTTPS。
因為並非所有路由器、防火牆和 Proxy 都會正確支援 HTTP/3,所以應該同時設定 HTTP/3 與 HTTP/1.1 和 HTTP/2。 這可以將 HttpProtocols.Http1AndHttp2AndHttp3
指定為端點所支援的通訊協定來完成。
如需詳細資訊,請參閱設定 ASP.NET Core Kestrel Web 伺服器的端點。
Alt-svc
HTTP/3 會透過 alt-svc
標頭探索為從 HTTP/1.1 或 HTTP/2 的升級。 這表示第一個要求通常會在切換至 HTTP/3 之前使用 HTTP/1.1 或 HTTP/2。 如果啟用 HTTP/3,則 Kestrel 會自動新增 alt-svc
標頭。
Localhost 測試
瀏覽器不允許 HTTP/3 上的自我簽署憑證,例如 Kestrel 開發憑證。
HttpClient
可以用於 .NET 6 或更新版本中的 localhost/loopback 測試。 使用HttpClient
來提出 HTTP/3 要求時,需要額外設定:
HTTP/3 優點
HTTP/3 所使用的語意與 HTTP/1.1 和 HTTP/2 相同:相同的要求方法、狀態碼和訊息欄位適用於所有版本。 差異在於基礎傳輸方式。 HTTP/1.1 和 HTTP/2 都使用 TCP 來做傳輸。 HTTP/3 使用與 HTTP/3 一起開發的新傳輸技術,稱為 QUIC。
相較於 HTTP/1.1 和 HTTP/2,HTTP/3 和 QUIC 有許多好處:
- 第一個要求的回應時間更快。 QUIC 和 HTTP/3 會以用戶端與伺服器之間的較少往返次數來交涉連線。 第一個要求更快抵達伺服器。
- 連線封包遺失時的體驗較好。 HTTP/2 會透過一個 TCP 連線多工處理多個要求。 連線的封包遺失會影響所有要求。 此問題稱為「隊頭阻塞」。 由於 QUIC 提供原生的多工處理功能,因此封包遺失只會影響到遺失資料的要求。
- 支援在網路之間轉換。 此功能適用於行動裝置,因為行動裝置變更位置時,通常會在 WIFI 和行動數據網路之間切換。 目前,HTTP/1.1 和 HTTP/2 連線在切換網路時會發生錯誤。 應用程式或網頁瀏覽器必須重試任何失敗的 HTTP 要求。 HTTP/3 可讓應用程式或網頁瀏覽器在網路變更時平順地繼續執行。 Kestrel 不支援 .NET 8 中的網路轉換。 未來的版本可能會提供此支援。
HTTP/3 是 HTTP 的已提議標準和第三個主要版本。 本文討論 HTTP/3 的需求。 ASP.NET Core 7.0 和更新版本完全支援 HTTP/3。
重要
設定來使用 HTTP/3 的應用程式也應該支援 HTTP/1.1 和 HTTP/2。
HTTP/3 需求
根據作業系統,HTTP/3 的需求會不同。 如果正在其上執行 Kestrel 的平台沒有 HTTP/3 的所有需求,則會將其停用,而且 Kestrel 將會回復至其他 HTTP 通訊協定。
Windows
- Windows 11 組建 22000 或更新版本或是 Windows Server 2022。
- TLS 1.3 或更新版本連線。
Linux
- 已安裝
libmsquic
套件。
libmsquic
是透過位於 packages.microsoft.com
的 Microsoft 官方 Linux 套件存放庫所發行。 若要安裝此套件:
- 新增
packages.microsoft.com
存放庫。 如需指示,請參閱適用於 Microsoft 產品的 Linux 軟體存放庫。 - 使用散發套件的套件管理員來安裝
libmsquic
套件。 例如,Ubuntu 上的apt install libmsquic=1.9*
。
附註:.NET 6 只與 1.9.x 版的 libmsquic 相容。 Libmsquic 2.x 因中斷性變更而不相容。 Libmsquic 會在需要時收到 1.9.x 的更新,以納入安全性修正程式。
macOS
macOS 目前不支援 HTTP/3,未來版本則可能會提供。
開始使用
預設不會啟用 HTTP/3。 將設定新增至 Program.cs
,以啟用 HTTP/3。
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, options) =>
{
options.ListenAnyIP(5001, listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
listenOptions.UseHttps();
});
});
上述程式碼會將連接埠 5001 設定為:
- 指定
HttpProtocols.Http1AndHttp2AndHttp3
,以搭配使用 HTTP/3 與 HTTP/1.1 和 HTTP/2。 - 使用
UseHttps
來啟用 HTTPS。 HTTP/3 需要 HTTPS。
因為並非所有路由器、防火牆和 Proxy 都會正確支援 HTTP/3,所以應該同時設定 HTTP/3 與 HTTP/1.1 和 HTTP/2。 這可以將 HttpProtocols.Http1AndHttp2AndHttp3
指定為端點所支援的通訊協定來完成。
如需詳細資訊,請參閱設定 ASP.NET Core Kestrel Web 伺服器的端點。
Alt-svc
HTTP/3 會透過 alt-svc
標頭探索為從 HTTP/1.1 或 HTTP/2 的升級。 這表示第一個要求通常會在切換至 HTTP/3 之前使用 HTTP/1.1 或 HTTP/2。 如果啟用 HTTP/3,則 Kestrel 會自動新增 alt-svc
標頭。
Localhost 測試
瀏覽器不允許 HTTP/3 上的自我簽署憑證 (例如 Kestrel 開發憑證)。
HttpClient
可以用於 .NET 6 或更新版本中的 localhost/loopback 測試。 使用HttpClient
來提出 HTTP/3 要求時,需要額外設定:
HTTP/3 優點
HTTP/3 所使用的語意與 HTTP/1.1 和 HTTP/2 相同:相同的要求方法、狀態碼和訊息欄位適用於所有版本。 差異在於基礎傳輸方式。 HTTP/1.1 和 HTTP/2 都使用 TCP 來做傳輸。 HTTP/3 使用與 HTTP/3 一起開發的新傳輸技術,稱為 QUIC。
相較於 HTTP/1.1 和 HTTP/2,HTTP/3 和 QUIC 有許多好處:
- 第一個要求的回應時間更快。 QUIC 和 HTTP/3 會以用戶端與伺服器之間的較少往返次數來交涉連線。 第一個要求更快抵達伺服器。
- 連線封包遺失時的體驗較好。 HTTP/2 會透過一個 TCP 連線多工處理多個要求。 連線的封包遺失會影響所有要求。 此問題稱為「隊頭阻塞」。 由於 QUIC 提供原生的多工處理功能,因此封包遺失只會影響到遺失資料的要求。
- 支援在網路之間轉換。 此功能適用於行動裝置,因為行動裝置變更位置時,通常會在 WIFI 和行動數據網路之間切換。 目前,HTTP/1.1 和 HTTP/2 連線會因切換網路時發生錯誤而失敗。 應用程式或網頁瀏覽器必須重試任何失敗的 HTTP 要求。 HTTP/3 可讓應用程式或網頁瀏覽器在網路變更時平順地繼續執行。 Kestrel 不支援 .NET 6 中的網路轉換。 未來的版本可能會提供此支援。
HTTP/3 是 HTTP 的第三個和即將推出主要版本。 本文討論 HTTP/3 的需求,以及如何設定 Kestrel 來使用它。
重要
.NET 6 中提供 HTTP/3 作為「預覽功能」。 HTTP/3 規格未完成,而且搭配 .NET 6 的 HTTP/3 可能存在行為或效能問題。
如需預覽功能支援的詳細資訊,請參閱支援的預覽功能一節。
設定來使用 HTTP/3 的應用程式也應該支援 HTTP/1.1 和 HTTP/2。 如果 HTTP/3 發現問題,則除非未來 ASP.NET Core 發行版本解決此問題,否則建議停用 HTTP/3。 公告 GitHub 存放庫會回報重大問題。
HTTP/3 需求
根據作業系統,HTTP/3 的需求會不同。 如果正在其上執行 Kestrel 的平台沒有 HTTP/3 的所有需求,則會將其停用,而且 Kestrel 將會回復至其他 HTTP 通訊協定。
Windows
- Windows 11 組建 22000 或更新版本或是 Windows Server 2022。
- TLS 1.3 或更新版本連線。
Linux
- 已安裝
libmsquic
套件。
libmsquic
是透過位於 packages.microsoft.com
的 Microsoft 官方 Linux 套件存放庫所發行。 若要安裝此套件:
- 新增
packages.microsoft.com
存放庫。 如需指示,請參閱適用於 Microsoft 產品的 Linux 軟體存放庫。 - 使用散發套件的套件管理員來安裝
libmsquic
套件。 例如,Ubuntu 上的apt install libmsquic=1.9*
。
附註:.NET 6 只與 1.9.x 版的 libmsquic 相容。 Libmsquic 2.x 因中斷性變更而不相容。 Libmsquic 會在需要時收到 1.9.x 的更新,以納入安全性修正程式。
macOS
macOS 目前不支援 HTTP/3,未來版本則可能會提供。
開始使用
預設不會啟用 HTTP/3。 將設定新增至 Program.cs
,以啟用 HTTP/3。
var builder = WebApplication.CreateBuilder(args);
builder.WebHost.ConfigureKestrel((context, options) =>
{
options.ListenAnyIP(5001, listenOptions =>
{
listenOptions.Protocols = HttpProtocols.Http1AndHttp2AndHttp3;
listenOptions.UseHttps();
});
});
上述程式碼會將連接埠 5001 設定為:
- 指定
HttpProtocols.Http1AndHttp2AndHttp3
,以搭配使用 HTTP/3 與 HTTP/1.1 和 HTTP/2。 - 使用
UseHttps
來啟用 HTTPS。 HTTP/3 需要 HTTPS。
因為並非所有路由器、防火牆和 Proxy 都會正確支援 HTTP/3,所以應該同時設定 HTTP/3 與 HTTP/1.1 和 HTTP/2。 這可以將 HttpProtocols.Http1AndHttp2AndHttp3
指定為端點所支援的通訊協定來完成。
如需詳細資訊,請參閱設定 ASP.NET Core Kestrel Web 伺服器的端點。
Alt-svc
HTTP/3 會透過 alt-svc
標頭探索為從 HTTP/1.1 或 HTTP/2 的升級。 這表示第一個要求通常會在切換至 HTTP/3 之前使用 HTTP/1.1 或 HTTP/2。 如果啟用 HTTP/3,則 Kestrel 會自動新增 alt-svc
標頭。
Localhost 測試
瀏覽器不允許 HTTP/3 上的自我簽署憑證 (例如 Kestrel 開發憑證)。
HttpClient
可以用於 .NET 6 或更新版本中的 localhost/loopback 測試。 使用HttpClient
來提出 HTTP/3 要求時,需要額外設定:- 將
HttpRequestMessage.Version
設定為 3.0 或 - 將
HttpRequestMessage.VersionPolicy
設定為HttpVersionPolicy.RequestVersionOrHigher
。
- 將
限制
Kestrel 中的 HTTP/3 尚不支援某些 HTTPS 案例。 如果在使用 HTTP/3 時使用 HttpsConnectionAdapterOptions 來呼叫 Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps
,則在 HttpsConnectionAdapterOptions 上設定下列選項沒有任何作業 (即不會執行任何動作):
使用 HTTP/3 時,呼叫下列 Microsoft.AspNetCore.Hosting.ListenOptionsHttpsExtensions.UseHttps
實作會擲回錯誤:
- UseHttps(this ListenOptions listenOptions, ServerOptionsSelectionCallback serverOptionsSelectionCallback, object state, TimeSpan handshakeTimeout)
- UseHttps(this ListenOptions listenOptions, TlsHandshakeCallbackOptions callbackOptions)
HTTP/3 優點
HTTP/3 所使用的語意與 HTTP/1.1 和 HTTP/2 相同:相同的要求方法、狀態碼和訊息欄位適用於所有版本。 差異在於基礎傳輸方式。 HTTP/1.1 和 HTTP/2 都使用 TCP 來做傳輸。 HTTP/3 使用與 HTTP/3 一起開發的新傳輸技術,稱為 QUIC。
相較於 HTTP/1.1 和 HTTP/2,HTTP/3 和 QUIC 有許多好處:
- 第一個要求的回應時間更快。 QUIC 和 HTTP/3 會以用戶端與伺服器之間的較少往返次數來交涉連線。 第一個要求更快抵達伺服器。
- 連線封包遺失時的體驗較好。 HTTP/2 會透過一個 TCP 連線多工處理多個要求。 連線的封包遺失會影響所有要求。 此問題稱為「隊頭阻塞」。 由於 QUIC 提供原生的多工處理功能,因此封包遺失只會影響到遺失資料的要求。
- 支援在網路之間轉換。 此功能適用於行動裝置,因為行動裝置變更位置時,通常會在 WIFI 和行動數據網路之間切換。 目前,HTTP/1.1 和 HTTP/2 連線會因切換網路時發生錯誤而失敗。 應用程式或網頁瀏覽器必須重試任何失敗的 HTTP 要求。 HTTP/3 可讓應用程式或網頁瀏覽器在網路變更時平順地繼續執行。 Kestrel 不支援 .NET 6 中的網路轉換。 未來的版本可能會提供此支援。