How to make the .net HttpClient use http 2.0?

前端 未结 4 1535
一生所求
一生所求 2020-12-05 05:30

I have an asp.net web api hosted on IIS 10 (windows server 2016). When I make a GET request to this from a Microsoft Edge browser, I see that HTTP 2.0

4条回答
  •  旧时难觅i
    2020-12-05 05:51

    In addition to WinHttpHandler (as described in Shawinder Sekhon's answer), .NET Core 3.0 includes HTTP/2 support in the default SocketsHttpHandler (#30740). Since the default is still HTTP/1.1 outside of UWP, Version must be specified on each request. This can be done on an as-needed basis for each request:

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

    Or for all requests by using a custom HttpMessageHandler, such as:

    public class ForceHttp2Handler : DelegatingHandler
    {
        public ForceHttp2Handler(HttpMessageHandler innerHandler)
            : base(innerHandler)
        {
        }
    
        protected override Task SendAsync(
            HttpRequestMessage request, CancellationToken cancellationToken)
        {
            request.Version = HttpVersion.Version20;
            return base.SendAsync(request, cancellationToken);
        }
    }
    

    which can delegate to SocketsHttpHandler, WinHttpHandler, or any other HttpMessageHandler which supports 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));
        }
    }
    ``
    

提交回复
热议问题