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的尽快升级。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值