0

0

C# IHttpClientFactory Typed Clients方法 C#如何创建类型化的HttpClient

畫卷琴夢

畫卷琴夢

发布时间:2026-02-18 03:13:28

|

225人浏览过

|

来源于php中文网

原创

Typed Client 是 IHttpClientFactory 提供的强类型封装模式,将 HttpClient 配置与业务逻辑绑定在类中;它不继承 HttpClient,而是通过构造函数注入由工厂管理的实例,避免手动创建导致的连接池、策略、生命周期等问题。

c# ihttpclientfactory typed clients方法 c#如何创建类型化的httpclient

Typed Client 是什么,和普通 HttpClient 有什么区别

Typed Client 不是新类型的客户端,而是 IHttpClientFactory 提供的一种注册与使用模式:把 HttpClient 和它的配置、行为(如重试、认证头)封装进一个强类型类里。它和直接 new HttpClient() 或用 IServiceCollection.AddHttpClient<t>()</t> 注册的普通命名客户端不同——后者只配了客户端实例,而 Typed Client 把“用这个客户端干啥”也一并定义在类型中。

关键点在于:Typed Client 类本身不继承 HttpClient,也不持有 HttpClient 字段,而是通过构造函数接收 HttpClient 实例,由 DI 容器自动注入。这避免了手动管理生命周期,也天然支持依赖注入链中的其他服务(比如 IOptionsMonitor<apisettings></apisettings>)。

如何注册并使用 Typed Client(.NET 6+ 推荐写法)

Program.cs 中注册:

builder.Services.AddHttpClient<GitHubService>(client =>
{
    client.BaseAddress = new Uri("https://api.github.com/");
    client.DefaultRequestHeaders.UserAgent.ParseAdd("MyApp/1.0");
});

对应的服务类定义为:

public class GitHubService
{
    private readonly HttpClient _httpClient;
<pre class="brush:php;toolbar:false;">public GitHubService(HttpClient httpClient)
{
    _httpClient = httpClient;
}

public async Task<string> GetRepoNameAsync(string owner, string repo)
{
    var response = await _httpClient.GetAsync($"repos/{owner}/{repo}");
    response.EnsureSuccessStatusCode();
    return await response.Content.ReadAsStringAsync();
}

}

注意:

  • GitHubService 不需要标记 [ServiceContract] 或继承任何基类
  • 构造函数参数必须是 HttpClient,不能是 IHttpClientFactory 或其他变体
  • 注册时泛型参数 <githubservice></githubservice> 必须和类名完全一致,否则 DI 无法解析

为什么不能在 Typed Client 里 new HttpClient

常见错误是这样写:

创一AI
创一AI

AI帮你写短视频脚本

下载
public class BadService
{
    private readonly HttpClient _client = new HttpClient(); // ❌ 错误!
    // ...
}

这会导致:

  • 绕过 IHttpClientFactory 的连接池复用和 DNS 刷新机制
  • 没有内置的 Polly 策略(如超时、重试)支持
  • 无法利用工厂提供的日志、指标、命名隔离等能力
  • 在高并发下容易触发 SocketException: Too many open files(尤其 Linux 容器环境)

Typed Client 的核心价值,就是让 HttpClient 实例的创建、配置、销毁全部交由工厂统一管控,业务类只专注逻辑。

多个 Typed Client 共享同一组配置?用命名客户端 + 委托注册

如果几个服务都要访问同一个 API 域名,但又希望各自独立类型(比如 OrderServiceInventoryService),可以复用命名配置:

builder.Services.AddHttpClient("internal-api", client =>
{
    client.BaseAddress = new Uri(builder.Configuration["InternalApi:BaseUrl"]);
    client.DefaultRequestHeaders.Authorization =
        new AuthenticationHeaderValue("Bearer", builder.Configuration["InternalApi:Token"]);
});
<p>builder.Services.AddTransient<OrderService>(sp =>
{
var httpClient = sp.GetRequiredService<IHttpClientFactory>()
.CreateClient("internal-api");
return new OrderService(httpClient);
});</p><p>builder.Services.AddTransient<InventoryService>(sp =>
{
var httpClient = sp.GetRequiredService<IHttpClientFactory>()
.CreateClient("internal-api");
return new InventoryService(httpClient);
});
</p>

这种方式比重复注册更可控,也便于后期切流或打标监控。

Typed Client 看似简单,真正容易出问题的地方在于:以为“只要构造函数有 HttpClient 就算用了工厂”,结果手动 new 了实例,或者混淆了命名客户端与类型化客户端的注册路径。一旦跨服务共享配置或加策略,这些边界就立刻暴露。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
磁盘配额是什么
磁盘配额是什么

磁盘配额是计算机中指定磁盘的储存限制,就是管理员可以为用户所能使用的磁盘空间进行配额限制,每一用户只能使用最大配额范围内的磁盘空间。php中文网为大家提供各种磁盘配额相关的内容,教程,供大家免费下载安装。

1520

2023.06.21

如何安装LINUX
如何安装LINUX

本站专题提供如何安装LINUX的相关教程文章,还有相关的下载、课程,大家可以免费体验。

714

2023.06.29

linux find
linux find

find是linux命令,它将档案系统内符合 expression 的档案列出来。可以指要档案的名称、类别、时间、大小、权限等不同资讯的组合,只有完全相符的才会被列出来。find根据下列规则判断 path 和 expression,在命令列上第一个 - ( ) , ! 之前的部分为 path,之后的是 expression。还有指DOS 命令 find,Excel 函数 find等。本站专题提供linux find相关教程文章,还有相关

300

2023.06.30

linux修改文件名
linux修改文件名

本专题为大家提供linux修改文件名相关的文章,这些文章可以帮助用户快速轻松地完成文件名的修改工作,大家可以免费体验。

791

2023.07.05

linux系统安装教程
linux系统安装教程

linux系统是一种可以免费使用,自由传播,多用户、多任务、多线程、多CPU的操作系统。本专题提供linux系统安装教程相关的文章,大家可以免费体验。

584

2023.07.06

linux查看文件夹大小
linux查看文件夹大小

Linux是一种自由和开放源码的类Unix操作系统,存在着许多不同的Linux版本,但它们都使用了Linux内核。Linux可安装在各种计算机硬件设备中,比如手机、平板电脑、路由器、视频游戏控制台、台式计算机、大型机和超级计算机。linux怎么查看文件夹大小呢?php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

562

2023.07.20

linux查看ip命令
linux查看ip命令

本专题为大家提供linux查看ip命令相关文章内容,感兴趣的朋友可以免费下载体验试试。

308

2023.07.20

linux查看cpu使用率
linux查看cpu使用率

在linux的系统维护中,可能需要经常查看cpu使用率,分析系统整体的运行情况。本专题为大家带来了linux查看cpu使用率的相关文章,感兴趣的朋友千万不要错过了。

394

2023.07.25

pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

462

2026.02.13

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 9.6万人学习

C 教程
C 教程

共75课时 | 4.8万人学习

C++教程
C++教程

共115课时 | 18.1万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号