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 it

using (var response = await client.GetAsync("/")) io

{ 變量

    Console.WriteLine(response.Content); cli

} 擴展

// HTTP/2 request 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);

相關文章
相關標籤/搜索