.Net Core在調用其他服務時,調用通常使用HttpClient,而HttpClient預設使用HTTP/1.1 。 配置 HttpClient 以使用 HTTP/2 h2 連接 自 .NET Core 3.0 發佈以來, .NET 開發人員可以使用 HttpClient 啟用 HTTP/2 。 ...
.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#http3
https://learn.microsoft.com/zh-cn/dotnet/core/extensions/httpclient-http3
https://www.siakabaro.com/use-http-2-with-httpclient-in-net-6-0/