如何使.net HttpClient使用http 2.0?

我在IIS 10(Windows Server 2016)上托管了一个asp.net web api。 当我从Microsoft Edge浏览器向此发出GET请求时,我发现在IIS日志中使用了HTTP 2.0

 2015-09-20 21:57:59 100.76.48.17 GET /RestController/Native - 443 - 73.181.195.76 HTTP/2.0 Mozilla/5.0+(Windows+NT+10.0;+Win64;+x64)+AppleWebKit/537.36+(KHTML,+like+Gecko)+Chrome/42.0.2311.135+Safari/537.36+Edge/12.10240 - 200 0 0 7299 

但是,当通过.net 4.6客户端发出GET请求时,如下所示,

 using (var client = new HttpClient()) { client.BaseAddress = new Uri("https://myapp.cloudapp.net/"); HttpResponseMessage response = await client.GetAsync("RestController/Native"); if (response.IsSuccessStatusCode) { await response.Content.CopyToAsync(new MemoryStream(buffer)); } } 

我在服务器日志中看到以下HTTP 1.1日志

 2015-09-20 20:57:41 100.76.48.17 GET /RestController/Native - 443 - 131.107.160.196 HTTP/1.1 - - 200 0 0 707 

如何让.net客户端使用HTTP / 2.0?

HttpClient尚不支持HTTP / 2。 它将在下一版本中提供(代号为KATANA)。 这是下一个版本的源代码链接 。

到那时,您可以实现自己的HttpMessageHandler对象,该对象实现HTTP / 2并将其传递给HttpClient的构造函数(您可能可以使用来自KATANA的源代码)。

1.确保您使用的是最新版本的Windows 10

2.安装WinHttpHandler

 Install-Package System.Net.Http.WinHttpHandler 

3.扩展WinHttpHandler以添加http2.0支持:

 public class Http2CustomHandler : WinHttpHandler { protected override Task SendAsync(HttpRequestMessage request, System.Threading.CancellationToken cancellationToken) { request.Version = new Version("2.0"); return base.SendAsync(request, cancellationToken); } } 

4.通过上面的处理程序到HttpClient构造函数

 using (var httpClient = new HttpClient(new Http2CustomHandler())) { // your custom code } 

HTTP / 2看起来在使用.NET 4.6.2的C#客户端调用中受支持

https://msdn.microsoft.com/en-us/library/ms171868(v=vs.110).aspx

HTTP / 2支持(Windows 10)

HTTP / 2是HTTP协议的新版本,可提供更好的连接利用率(客户端和服务器之间的往返次数更少),从而为用户提供更低的延迟网页加载。 网页(与服务相对)从HTTP / 2中受益最多,因为协议优化了作为单一体验的一部分请求的多个工件。 .NET Framework 4.6中的ASP.NET中添加了HTTP / 2支持。 由于网络function存在于多个层,因此Windows,IIS和ASP.NET中需要新function才能启用HTTP / 2。 您必须在Windows 10上运行才能在ASP.NET中使用HTTP / 2。

对于使用System.Net.Http.HttpClient API的Windows 10通用Windows平台(UWP)应用程序,默认情况下也支持HTTP / 2。