全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C#怎么使用IHttpClientFactory C# HttpClientFactory最佳实践

IHttpClientFactory是.NET Core 2.1+推荐的HttpClient管理方式,解决new HttpClient导致的连接泄漏、DNS缓存不更新和SSL复用问题;它通过复用HttpMessageHandler提升性能与可靠性,并支持命名客户端、类型化客户端及Polly策略集成。

在C#中,IHttpClientFactory 是 .NET Core 2.1+ 推荐的创建和管理 HttpClient 实例的方式,它解决了直接 new HttpClient 带来的连接泄漏、DNS刷新不及时、配置复用难等问题。

为什么不能直接 new HttpClient?

每次 new HttpClient 都会创建新的底层 HttpClientHandler,而后者持有连接池和 DNS 缓存。频繁创建销毁会导致:

  • Socket 耗尽(TIME_WAIT 状态堆积)
  • DNS 变更无法及时生效(默认缓存 2 分钟)
  • SSL/TLS 会话无法复用,影响性能

IHttpClientFactory 通过统一管理 HttpMessageHandler 生命周期(默认 2 分钟重用,支持自定义策略),让多个 HttpClient 实例共享底层资源。

注册和基础用法

Program.cs(.NET 6+)或 Startup.ConfigureServices 中注册:

builder.Services.AddHttpClient(); // 默认命名客户端

然后在服务中注入并使用:

public class WeatherService
{
    private readonly IHttpClientFactory _factory;

    public WeatherService(IHttpClientFactory factory) => _factory = factory;

    public async Task GetWeatherAsync()
    {
        var client = _factory.CreateClient(); // 创建轻量级 HttpClient 实例
        return await client.GetStringAsync("https://api.example.com/weather");
    }
}

注意:CreateClient() 返回的是“逻辑客户端”,不是新连接——底层 handler 是复用的。

命名客户端与类型化客户端(推荐)

避免魔法字符串,用命名或类型化方式组织不同用途的客户端:

  • 命名客户端:适合简单场景,注册时指定名称和配置
builder.Services.AddHttpClient("github", c =>
{
    c.BaseAddress = new Uri("https://api.github.com/");
    c.DefaultRequestHeaders.UserAgent.ParseAdd("MyApp/1.0");
});

使用时传入名称:

var client = _factory.CreateClient("github");
  • 类型化客户端(Type-Safe Client):更推荐,把 HTTP 调用封装成强类型服务
public class GitHubService
{
    private readonly HttpClient _client;

    public GitHubService(HttpClient client)
    {
        _client = client;
        _client.BaseAddress = new Uri("https://api.github.com/");
        _client.DefaultRequestHeaders.UserAgent.ParseAdd("MyApp/1.0");
    }

    public async Task> GetReposAsync(string user) =>
        await _client.GetFromJsonAsync>($"/users/{user}/repos");
}

// 注册
builder.Services.AddHttpClient();

使用时直接注入 GitHubService,无需手动创建 client,也天然支持依赖注入和测试模拟。

添加拦截、重试、熔断等策略

通过 AddPolicyHandlerAddTransientFaultHandler 等扩展方法集成 Polly

builder.Services.AddHttpClient()
    .AddTransientHttpErrorPolicy(p => p.WaitAndRetryAsync(3, _ => TimeSpan.FromMilliseconds(500)))
    .AddTypedClient();

常见组合:

  • 重试策略:对 5xx、网络异常自动重试
  • 熔断器(Circuit Breaker):连续失败后快速失败,避免雪崩
  • 超时策略:为每个请求单独设置超时(比 HttpClient.Timeout 更灵活)

注意:策略作用于 handler 级别,不是 client 级别;同一命名客户端的所有请求都会应用相同策略。

基本上就这些。用好 IHttpClientFactory 的关键是——别自己 new HttpClient,优先选类型化客户端 + Polly 策略,再配合命名隔离不同服务域。不复杂但容易忽略细节。


# js  # git  # json  # github  # app  # ssl  # ai  # dns  # nas  # c#  # .net  # 为什么  # 封装  # 字符串  #   # http  # 客户端  # 复用  # 重试  # 新和  # 的是  # 多个  # 自定义  # 用好  # 作用于  # 更灵活 


相关文章: 建站为何优先选择香港服务器?  一键网站制作软件,义乌购一件代发流程?  合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?  如何通过wdcp面板快速创建网站?  制作国外网站的软件,国外有哪些比较优质的网站推荐?  一键制作网站软件下载安装,一键自动采集网页文档制作步骤?  较简单的网站制作软件有哪些,手机版网页制作用什么软件?  html制作网站的步骤有哪些,iapp如何添加网页?  深圳网站制作的公司有哪些,dido官方网站?  建站之星ASP如何实现CMS高效搭建与安全管理?  建站之星展会模板:智能建站与自助搭建高效解决方案  建设网站制作价格,怎样建立自己的公司网站?  Python多线程使用规范_线程安全解析【教程】  建站主机空间推荐 高性价比配置与快速部署方案解析  建站之星安装后如何自定义网站颜色与字体?  网站app免费制作软件,能免费看各大网站视频的手机app?  公司网站设计制作厂家,怎么创建自己的一个网站?  如何选择高效响应式自助建站源码系统?  建站之星代理如何获取技术支持?  个人摄影网站制作流程,摄影爱好者都去什么网站?  如何挑选优质建站一级代理提升网站排名?  5种Android数据存储方式汇总  教学网站制作软件,学习*后期制作的网站有哪些?  TestNG的testng.xml配置文件怎么写  如何在万网主机上快速搭建网站?  建站之星导航配置指南:自助建站与SEO优化全解析  东莞专业网站制作公司有哪些,东莞招聘网站哪个好?  微信小程序 五星评分(包括半颗星评分)实例代码    上海网站制作网站建设公司,建筑电工证网上查询系统入口?  建站之星伪静态规则如何正确配置?  广州网站设计制作一条龙,广州巨网网络科技有限公司是干什么的?  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  如何通过VPS建站无需域名直接访问?  儿童网站界面设计图片,中国少年儿童教育网站-怎么去注册?  如何通过.red域名打造高辨识度品牌网站?  如何快速生成可下载的建站源码工具?  零基础网站服务器架设实战:轻量应用与域名解析配置指南  定制建站哪家更专业可靠?推荐榜单揭晓  如何通过虚拟机搭建网站?详细步骤解析  如何在新浪SAE免费搭建个人博客?  香港服务器部署网站为何提示未备案?  建站之星上传入口如何快速找到?  如何使用Golang table-driven基准测试_多组数据测量函数效率  Python如何创建带属性的XML节点  如何用PHP快速搭建CMS系统?  孙琪峥织梦建站教程如何优化数据库安全?  创业网站制作流程,创业网站可靠吗?  相亲简历制作网站推荐大全,新相亲大会主持人小萍萍资料?  如何配置WinSCP新建站点的密钥验证步骤? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。