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