HTTP/2 是 HTTP 協議的主要修訂版。HTTP/2 的一些顯著功能是支持標頭壓縮和通過同一連接完全多路復用流。雖然 HTTP/2 保留了 HTTP 的語義(HTTP 標頭、方法等),但它在數據框架和通過無線方式發送方面與 HTTP/1.x 是一種變化。
HttpClient 現在添加用於發出 HTTP/2 請求的支持。當默認值仍為 HTTP/1.1 時,您可以通過在 HTTP 請求消息上設置版本來選擇使用 HTTP/2。
---------------------
var client = new HttpClient() { BaseAddress = new Uri("https://localhost:5001") };
// HTTP/1.1 request
using (var response = await client.GetAsync("/"))
{
Console.WriteLine(response.Content);
}
// HTTP/2 request
using (var request = new HttpRequestMessage(HttpMethod.Get, "/") { Version = new Version(2, 0) })
using (var response = await client.SendAsync(request))
{
Console.WriteLine(response.Content);
}
---------------------
或者,您可以通過在 HttpClient 上設置默認請求版本屬性來默認發送 HTTP/2 請求。
---------------------
var client = new HttpClient()
{
BaseAddress = new Uri("https://localhost:5001"),
DefaultRequestVersion = new Version(2, 0)
};
// Defaults to HTTP/2
using (var response = await client.GetAsync("/"))
{
Console.WriteLine(response.Content);
}
---------------------
由於框架的這種更改,服務器和客戶端需要協商所使用的協議版本。應用程序層協議協商 (ALPN) 是一個 TLS 擴展,允許服務器和客戶端協商作為 TLS 握手的一部分使用的協議版本。雖然服務器和客戶端之間有可能在協議上事先知道,但大多數服務器僅支持 ALPN 作為建立 HTTP/2 連接的唯一方法。因此,HTTP/2 僅在 TLS 連接上由 HttpClient 協商。
在開發方案中,當服務器和客戶端事先知道兩者都講 HTTP/2 未加密時,您可以通過設置 AppContext 開關或環境變量(DOTNET_SYSTEM_NET_HTTP_SOCKETSHTTPHANDLER_HTTP2UNENCRYPTEDSUPPORT=1)在明文上建立 HTTP/2 連接。
AppContext.SetSwitch("System.Net.Http.SocketsHttpHandler.Http2UnencryptedSupport", true);
