如何使.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的源代码)。
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
}
这效果很好。 – huyc
您可以使用System.Net.Http(4.3.0或更高版本)通过的`HttpRequestMessage'Version
属性设置为HTTP/2
HttpClient
:
yourHttpRequestMessage.Version = new Version(2, 0);
有了这个属性设置HttpClient
的内部处理程序将尝试在可用时使用HTTP/2
,如果不是,则回退到HTTP/1.1
。
您链接到的回购似乎只针对服务器组件,而不是客户端(有一个测试客户端,它使用TcpClient,但不是真正的HttpClient) –
@RacilHilan谢谢你的回答。 “你可以实现你自己的实现HTTP/2的HttpMessageHandler对象”。你能详细阐述一下吗? –
@RashminJaviya您可以使用我的答案中的链接从他们的源代码复制代码,并将其添加到您的项目中。请记住,代码来自开发,所以你必须自己做所有的测试和可能的修复。显然,这不是一项简单的任务,但它是回答这个问题的唯一方式。现在,情况已经改变。如果符合您的需求,请参阅下面的Oliver的答案。 –