咨询区
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);
}
}
![](https://i-blog.csdnimg.cn/blog_migrate/a7c80e6b44328ed0076fd92c6f9c1d97.png)
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的尽快升级。