NET问答: 如何让 HttpClient 支持 Http 2.0 协议?

Posted dotNET跨平台

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了NET问答: 如何让 HttpClient 支持 Http 2.0 协议?相关的知识,希望对你有一定的参考价值。

咨询区

  • Justin Lessard

我的一个项目需要支持 Http 2.0 进行数据的收发,目前用的项目版本是 .NET Core 2.2,我选型了 HttpClient,但是我发现一个问题,在生产环境中的程序返回的 response 版本一直都是 Http 1.1,请问大家我该如何正确配置?

参考代码:


using (var client = new HttpClient())
{
    using (var request = new HttpRequestMessage(new HttpMethod("GET"),"https://duckduckgo.com/"))
    {
        request.Version = new Version(2, 0);
        var response = await client.SendAsync(request);

        Console.WriteLine(response.Version);
    }
}

回答区

  • Panagiotis Kanavos

你应该用的是 .Net Core 3 之前的版本,因为在 3.0 中已经提供了 Http 2 的支持,下面的代码将会解决你的问题,并输出 2.0.


    class Program
    {
        static void Main(string[] args)
        {
            Test();
            Console.ReadLine();
        }

        static async void Test()
        {
            var client = new HttpClient();

            var req = new HttpRequestMessage(HttpMethod.Get, "https://http2.akamai.com/demo")
            {
                Version = new Version(2, 0)
            };

            var x = await client.SendAsync(req);
            var version = x.Version;

            Console.WriteLine(version);
        }
    }

  • undrivendev

.NET 2.1 中,HttpClient 底层采用的是 SocketsHttpClientHandler, 这种新一代的 handler 是不支持 Http/2 的,所以这是你一直看不到 1.1  的原因。

另外现在都不推荐直接用 HttpClient,最佳模式是改成 HttpClientFactory,可以参考官方的使用案例:https://docs.microsoft.com/en-us/aspnet/core/fundamentals/http-requests?view=aspnetcore-5.0

下面是一个将 HttpClient 注册为 typeClient 并且配置成 http/2 的例子。


public void ConfigureServices(IServiceCollection services)
{
...
   services.AddHttpClient<ExampleService>()
       .ConfigureHttpClient((client) =>
       {
           client.DefaultRequestVersion = new Version(2, 0);
       });
...
}

点评区

其实网络上有很多关于描述 HttpClient 的弊端,比如无法有效的感知 url 的 DNS 变更,network 上的 4min 问题,大家还是有必要明白这些问题的解决方案  HttpClientFactory,从这一系列例子上,.NET Core 3 开始已经是一本相对功能齐全,稳定的版本了,项目能升级到3.0的尽快升级。

以上是关于NET问答: 如何让 HttpClient 支持 Http 2.0 协议?的主要内容,如果未能解决你的问题,请参考以下文章

.net HttpClient 与自定义 JsonConverter

NET问答: 如何将十六进制的 #FFDFD991 转成 C# 中的 Color 类?

JAVA - HttpClient(JDK11)

System.Net.Http.HttpClient如何选择认证类型?

如何在 .NET 6 中用 HttpClient 替换过时的 WebClient

使用 System.Net.HttpClient 进行上传时如何跟踪进度? [复制]