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

相关文章
相关标签/搜索