请使用IHttpClientFactory代替直接创建HttpClient

本文介绍如何使用IHttpClientFactory创建HttpClient,避免Socket耗尽问题。包括基本使用、命名化及类型化HttpClient的方法,并讨论了单例或静态使用的情况。
Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

直接实例创建HttpClient,当然是可以。问题就出在,当遇到频繁访问的时候,会导致Socket耗尽。即便用using语法包一层,但在调用Dispose方法时,连接并不会立即释放,如果遇到频繁访问,依然存在Socket耗尽的问题,所以,微软推荐用IHttpClientFactory来创建HttpClient

基本使用

在启动方法中使用AddHttpClient来注册IHttpClientFactory

public void ConfigureServices(IServiceCollection services)
{
    services.AddHttpClient();

在需使用的地方

public class TestController:Controller
{
   private readonly IHttpClientFactory _httpClientFactory;
   public TestController(IHttpClientFactory httpClientFactory)
   {
      _httpClientFactory = httpClientFactory;
   }
   public IActionResult Home()
   {
      var client = _clientFactory.CreateClient();
	  ...
   }
}

命名化 HttpClient

有时候项目中可能会用到多个client,每个client也需要不同的配置,比如做爬虫你可能要带上Cookie信息,诸如此类的需求,这时候我们就可以使用命名化HttpClient

services.AddHttpClient("github", c =>
{
    c.BaseAddress = new Uri("https://api.github.com/");
    // Github API versioning
    c.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");
    // Github requires a user-agent
    c.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample");
});

在需使用的地方

public class TestController:Controller
{
   private readonly IHttpClientFactory _httpClientFactory;
   public TestController(IHttpClientFactory httpClientFactory)
   {
      _httpClientFactory = httpClientFactory;
   }
   public IActionResult Home()
   {
      var client = _clientFactory.CreateClient("github");
	  ...
   }
}

类型化 HttpClient

启动类中注册

services.AddHttpClient<TestService>();//普通注册

services.AddHttpClient<Test1Service>(c =>
{
    c.BaseAddress = new Uri("https://api.github.com/");
    c.DefaultRequestHeaders.Add("Accept", "application/vnd.github.v3+json");
    c.DefaultRequestHeaders.Add("User-Agent", "HttpClientFactory-Sample");
}); // 配置

在需要使用的地方

public class TestService
{
   private readonly HttpClient _httpClient;
   public TestService(HttpClient httpClient)
   {
      _httpClient = httpClient;
   }
   public IActionResult Home()
   {
      var client = _httpClient;
	  ...
   }
}

单例或静态使用

在stackoverflow上也看到,有人把 HttpClient 做成单例或直接设为静态字段的,其实我觉得也是可以的,微软官方文档上也写着

But there’s a second issue with HttpClient that you can have when you use it as singleton or static object. In this case, a singleton or static HttpClient doesn’t respect DNS changes, as explained in this issue at the dotnet/corefx GitHub repository.

只是不能监测DNS变动,如果你能确保DNS不变,那么是可以用静态或单例的,个人觉得。

您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值