c# HttpClient的HTTP/2支持


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);


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM