26

我有一个托管在 IIS 10(Windows 服务器 2016)上的 asp.net web api。当我GET从 Microsoft Edge 浏览器发出请求时,我看到它HTTP 2.0在 IIS 日志中使用

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 客户端发出请求时,

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 ?

4

4 回答 4

39

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

2.安装WinHttpHandler :

Install-Package System.Net.Http.WinHttpHandler

3.扩展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
}
于 2017-03-29T19:00:32.283 回答
7

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

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

于 2015-09-20T23:11:31.197 回答
6

除了WinHttpHandler如 Shawinder Sekhon 的回答中所述)之外,.NET Core 3.0还包括默认的HTTP/2 支持SocketsHttpHandler#30740)。由于UWP 之外的默认Version值仍然是 HTTP/1.1,因此必须在每个请求上指定。这可以根据每个请求的需要完成:

using (var client = new HttpClient())
{
    client.BaseAddress = new Uri("https://myapp.cloudapp.net/");

    HttpResponseMessage response = await client.SendAsync(
        new HttpRequestMessage(HttpMethod.Get, "RestController/Native")
        {
            Version = HttpVersion.Version20,
        });
    if (response.IsSuccessStatusCode)
    {
        await response.Content.CopyToAsync(new MemoryStream(buffer));
    }
}

或者使用自定义的所有请求HttpMessageHandler,例如:

public class ForceHttp2Handler : DelegatingHandler
{
    public ForceHttp2Handler(HttpMessageHandler innerHandler)
        : base(innerHandler)
    {
    }

    protected override Task<HttpResponseMessage> SendAsync(
        HttpRequestMessage request, CancellationToken cancellationToken)
    {
        request.Version = HttpVersion.Version20;
        return base.SendAsync(request, cancellationToken);
    }
}

可以委托给SocketsHttpHandlerWinHttpHandler或任何其他HttpMessageHandler支持 HTTP/2 的:

using (var client = new HttpClient(new ForceHttp2Handler(new SocketsHttpHandler())))
{
    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));
    }
}
于 2019-11-27T23:30:33.703 回答
5

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 中受益最多,因为该协议针对作为单一体验的一部分请求的多个工件进行了优化。HTTP/2 支持已添加到 .NET Framework 4.6 中的 ASP.NET。由于网络功能存在于多个层,因此 Windows、IIS 和 ASP.NET 中需要新功能来启用 HTTP/2。您必须在 Windows 10 上运行才能将 HTTP/2 与 ASP.NET 一起使用。

对于使用 System.Net.Http.HttpClient API 的 Windows 10 通用 Windows 平台 (UWP) 应用,HTTP/2 也受支持且默认开启。

于 2016-07-19T14:56:31.190 回答