.Net Core在呼叫其他服務時,呼叫通常使用HttpClient,而HttpClient預設使用HTTP/1.1 。
自 .NET Core 3.0 釋出以來, .NET 開發人員可以使用 HttpClient 啟用 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);
在 .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 });
在 .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/