將 HTTP/2 與 ASP.NET Core Kestrel 網頁伺服器搭配使用

如果符合下列基本需求,則可以針對 ASP.NET Core 應用程式使用 HTTP/2

  • 作業系統
    • Windows Server 2016/Windows 10 或更新版本‡
    • Linux 含 OpenSSL 1.0.2 或更新版本 (例如 Ubuntu 16.04 或更新版本)
    • macOS 10.15 或更新版本
  • 目標 Framework:.NET Core 2.2 或更新版本
  • Application-Layer Protocol Negotiation (ALPN) 連線
  • TLS 1.2 或更新版本連線

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

如果已建立 HTTP/2 連線,HttpRequest.Protocol 會報告 HTTP/2

從 .NET Core 3.0 開始,預設會啟用 HTTP/2。 如需組態的詳細資訊,請參閱 Kestrel HTTP/2 限制ListenOptions.Protocols 各節。

進階 HTTP/2 功能

Kestrel 中的其他 HTTP/2 功能支援 gRPC,包括支援回應結尾和傳送重設框架。

結尾

HTTP 結尾與 HTTP 標頭類似,不同之處在於 HTTP 結尾是在傳送回應本文之後傳送。 IIS 和 HTTP.sys 僅支援 HTTP/2 回應結尾。

if (httpContext.Response.SupportsTrailers())
{
    httpContext.Response.DeclareTrailer("trailername");	

    // Write body
    httpContext.Response.WriteAsync("Hello world");

    httpContext.Response.AppendTrailer("trailername", "TrailerValue");
}

在上述範例程式碼中:

  • SupportsTrailers 確保回應支援結尾。
  • DeclareTrailer 將指定的結尾名稱新增至 Trailer 回應標頭。 宣告回應的結尾是選用項目,但建議這樣做。 如果呼叫 DeclareTrailer,則必須在傳送回應標頭之前進行。
  • AppendTrailer 附加結尾。

Reset

重設允許伺服器重設具有指定錯誤碼的 HTTP/2 要求。 重設的要求被視為已中止。

var resetFeature = httpContext.Features.Get<IHttpResetFeature>();
resetFeature.Reset(errorCode: 2);

在上述程式碼範例中的 Reset 指定 INTERNAL_ERROR 錯誤碼。 如需 HTTP/2 錯誤碼的詳細資訊,請瀏覽 HTTP/2 規格錯誤碼一節。

如果符合下列基本需求,則可以針對 ASP.NET Core 應用程式使用 HTTP/2

  • 作業系統†
    • Windows Server 2016/Windows 10 或更新版本‡
    • Linux 含 OpenSSL 1.0.2 或更新版本 (例如 Ubuntu 16.04 或更新版本)
  • 目標 Framework:.NET Core 2.2 或更新版本
  • Application-Layer Protocol Negotiation (ALPN) 連線
  • TLS 1.2 或更新版本連線

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

如果已建立 HTTP/2 連線,HttpRequest.Protocol 會報告 HTTP/2

從 .NET Core 3.0 開始,預設會啟用 HTTP/2。 如需組態的詳細資訊,請參閱 Kestrel HTTP/2 限制ListenOptions.Protocols 各節。

進階 HTTP/2 功能

Kestrel 中的其他 HTTP/2 功能支援 gRPC,包括支援回應結尾和傳送重設框架。

結尾

HTTP 結尾與 HTTP 標頭類似,不同之處在於 HTTP 結尾是在傳送回應本文之後傳送。 IIS 和 HTTP.sys 僅支援 HTTP/2 回應結尾。

if (httpContext.Response.SupportsTrailers())
{
    httpContext.Response.DeclareTrailer("trailername");	

    // Write body
    httpContext.Response.WriteAsync("Hello world");

    httpContext.Response.AppendTrailer("trailername", "TrailerValue");
}

在上述範例程式碼中:

  • SupportsTrailers 確保回應支援結尾。
  • DeclareTrailer 將指定的結尾名稱新增至 Trailer 回應標頭。 宣告回應的結尾是選用項目,但建議這樣做。 如果呼叫 DeclareTrailer,則必須在傳送回應標頭之前進行。
  • AppendTrailer 附加結尾。

Reset

重設允許伺服器重設具有指定錯誤碼的 HTTP/2 要求。 重設的要求被視為已中止。

var resetFeature = httpContext.Features.Get<IHttpResetFeature>();
resetFeature.Reset(errorCode: 2);

在上述程式碼範例中的 Reset 指定 INTERNAL_ERROR 錯誤碼。 如需 HTTP/2 錯誤碼的詳細資訊,請瀏覽 HTTP/2 規格錯誤碼一節。

如果符合下列基本需求,則可以針對 ASP.NET Core 應用程式使用 HTTP/2

  • 作業系統†
    • Windows Server 2016/Windows 10 或更新版本‡
    • Linux 含 OpenSSL 1.0.2 或更新版本 (例如 Ubuntu 16.04 或更新版本)
  • 目標 Framework:.NET Core 2.2 或更新版本
  • Application-Layer Protocol Negotiation (ALPN) 連線
  • TLS 1.2 或更新版本連線

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

如果已建立 HTTP/2 連線,HttpRequest.Protocol 會報告 HTTP/2

從 .NET Core 3.0 開始,預設會啟用 HTTP/2。 如需組態的詳細資訊,請參閱 Kestrel HTTP/2 限制ListenOptions.Protocols 各節。

進階 HTTP/2 功能

Kestrel 中的其他 HTTP/2 功能支援 gRPC,包括支援回應結尾和傳送重設框架。

結尾

HTTP 結尾與 HTTP 標頭類似,不同之處在於 HTTP 結尾是在傳送回應本文之後傳送。 IIS 和 HTTP.sys 僅支援 HTTP/2 回應結尾。

if (httpContext.Response.SupportsTrailers())
{
    httpContext.Response.DeclareTrailer("trailername");	

    // Write body
    httpContext.Response.WriteAsync("Hello world");

    httpContext.Response.AppendTrailer("trailername", "TrailerValue");
}

在上述範例程式碼中:

  • SupportsTrailers 確保回應支援結尾。
  • DeclareTrailer 將指定的結尾名稱新增至 Trailer 回應標頭。 宣告回應的結尾是選用項目,但建議這樣做。 如果呼叫 DeclareTrailer,則必須在傳送回應標頭之前進行。
  • AppendTrailer 附加結尾。

Reset

重設允許伺服器重設具有指定錯誤碼的 HTTP/2 要求。 重設的要求被視為已中止。

var resetFeature = httpContext.Features.Get<IHttpResetFeature>();
resetFeature.Reset(errorCode: 2);

在上述程式碼範例中的 Reset 指定 INTERNAL_ERROR 錯誤碼。 如需 HTTP/2 錯誤碼的詳細資訊,請瀏覽 HTTP/2 規格錯誤碼一節。