如何使.net HttpClient使用http 2.0?

问题描述:

我有一个asp.net Web API托管在IIS 10(Windows Server 2016)上。当我把从微软边缘浏览器GET要求这一点,我看到HTTP 2.0在IIS用于记录如何使.net HttpClient使用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 

然而,当GET请求通过.net 4.6 client下面进行,

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 CL客户使用HTTP/2.0?

HttpClient还不支持HTTP/2。它将在下一个版本中提供(代码名称KATANA)。这里是link to their source code for the next release。直到那时,你可以实现你自己的实现HTTP/2的HttpMessageHandler对象,并将它传递给HttpClient的构造函数(你可以使用KATANA的源代码)。

+0

您链接到的回购似乎只针对服务器组件,而不是客户端(有一个测试客户端,它使用TcpClient,但不是真正的HttpClient) –

+0

@RacilHilan谢谢你的回答。 “你可以实现你自己的实现HTTP/2的HttpMessageHandler对象”。你能详细阐述一下吗? –

+0

@RashminJaviya您可以使用我的答案中的链接从他们的源代码复制代码,并将其添加到您的项目中。请记住,代码来自开发,所以你必须自己做所有的测试和可能的修复。显然,这不是一项简单的任务,但它是回答这个问题的唯一方式。现在,情况已经改变。如果符合您的需求,请参阅下面的Oliver的答案。 –

HTTP/2看起来将在C#客户端能够支持使用.NET调用4.6.2

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

HTTP/2支持(Windows 10)

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

HTTP/2被默认为Windows 10通用 Windows平台(UWP),其使用System.Net.Http.HttpClient API的应用也支持和上。

1.确保你在最新版本的Windows 10

2.安装WinHttpHandler

Install-Package System.Net.Http.WinHttpHandler 

3.Extend WinHttpHandler添加http2.0支持:

public class Http2CustomHandler : WinHttpHandler 
{ 
    protected override Task<HttpResponseMessage> 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 
} 
+0

这效果很好。 – huyc

您可以使用System.Net.Http(4.3.0或更高版本)通过的`HttpRequestMessage'Version属性设置为HTTP/2HttpClient

yourHttpRequestMessage.Version = new Version(2, 0); 

有了这个属性设置HttpClient的内部处理程序将尝试在可用时使用HTTP/2,如果不是,则回退到HTTP/1.1