HttpClient 正确姿势:为什么不要 new HttpClient() 到处用?

作者:微信公众号:【架构师老卢】
2-1 10:25
40

很多项目一开始都会写出这种代码:

using var http = new HttpClient();
var text = await http.GetStringAsync(url);

它能跑,但在高并发/长期运行的服务里可能带来两个经典问题:

1) Socket 耗尽(TIME_WAIT 太多)

频繁创建/销毁 HttpClient 会导致底层连接无法复用,连接处于 TIME_WAIT,最终出现请求失败、延迟飙升。

2) DNS 变更不生效

长时间持有同一个 HttpClient 又可能导致 DNS 变更后仍走旧地址(取决于平台/Handler 配置)。

推荐:HttpClientFactory

在 ASP.NET Core 里使用 IHttpClientFactory

builder.Services.AddHttpClient();

public class MyService
{
    private readonly HttpClient _http;
    public MyService(IHttpClientFactory factory)
        => _http = factory.CreateClient();
}

更推荐 Typed Client:

builder.Services.AddHttpClient<GithubClient>(c =>
{
    c.BaseAddress = new Uri("https://api.github.com/");
});

参考链接

  • HttpClient guidelines:https://learn.microsoft.com/dotnet/fundamentals/networking/http/httpclient-guidelines
相关留言评论
昵称:
邮箱:
阅读排行