為HttpClient開啟HTTP/2

2023-04-28 12:00:45

.Net Core在呼叫其他服務時,呼叫通常使用HttpClient,而HttpClient預設使用HTTP/1.1 。

 

 

設定 HttpClient 以使用 HTTP/2 h2 連線

自 .NET Core 3.0 釋出以來, .NET 開發人員可以使用 HttpClient 啟用 HTTP/2 。

 

設定 HTTP/2 的方法

DefaultRequestVersion和DefaultVersionPolicy選項在HttpClient物件本身上可用。這些屬性將應用於通過常規 HttpClient 方法(如GetAsync、PostAsync、PatchAsync或PutAsync )完成的所有請求。

 

直接設定

var client = new HttpClient();
client.DefaultRequestVersion = HttpVersion.Version20;
client.DefaultVersionPolicy = HttpVersionPolicy.RequestVersionOrLower;

DI

builder.Services.AddHttpClient("h2multiconnnections", httpclient =>
{
    httpclient.DefaultRequestVersion = HttpVersion.Version20;
    httpclient.DefaultVersionPolicy = HttpVersionPolicy.RequestVersionOrLower;
})

 

HTTPRequestMessage

如果您使用Send或SendAsync方法,您必須在其中傳遞HttpRequestMessage的範例,則需要在 HttpRequestMessage 範例上設定Version和VersionPolicy屬性。

var request = new HttpRequestMessage(HttpMethod.Post, url);
request.Version = HttpVersion.Version20;
request.VersionPolicy = HttpVersionPolicy.RequestVersionOrLower;
var response = await _client.SendAsync(request);

 

設定 HttpClient 以使用 HTTP/2 的多個連線

在 .NET 5.0 和 .NET 6.0 中,HttpClient 預設設定為僅開啟 1 個到 HTTP/2 伺服器的連線。另外,最大並行流數的推薦值為100。

在某些情況下,出於效能原因,如果您在短時間內傳送數千個請求,則可能需要與伺服器建立 1 個以上的連線。出於這個原因,在 .NET 5.0 中,Microsoft在SocketsHttpHandler類上引入了EnableMultipleHttp2Connections屬性,使開發人員能夠根據需要更改預設行為。

builder.Services.AddHttpClient("h2multiconnnections", httpclient =>
{
    httpclient.DefaultRequestVersion = HttpVersion.Version20;
    httpclient.DefaultVersionPolicy = HttpVersionPolicy.RequestVersionOrLower;
})
.ConfigurePrimaryHttpMessageHandler(() =>
  new SocketsHttpHandler
  {
      EnableMultipleHttp2Connections = true
  });

 

HTTP/3

在 .NET 6 中,HTTP/3 可作為預覽功能使用,因為 HTTP/3 規範尚未最終確定。帶有 .NET 6 的 HTTP/3 中可能存在行為或效能問題。

https://learn.microsoft.com/zh-cn/dotnet/core/whats-new/dotnet-6

https://learn.microsoft.com/zh-cn/dotnet/core/extensions/httpclient-http3

https://www.siakabaro.com/use-http-2-with-httpclient-in-net-6-0/