相关文章推荐
憨厚的小马驹  ·  java ...·  10 月前    · 
喝醉的卤蛋  ·  3-如何将 PDF ...·  1 年前    · 

直接实例创建 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不变,那么是可以用静态或单例的,个人觉得。

直接实例创建HttpClient,当然是可以。问题就出在,当遇到频繁访问的时候,会导致Socket耗尽。即便用using语法包一层,但在调用Dispose方法时,连接并不会立即释放,如果遇到频繁访问,依然存在Socket耗尽的问题,所以,微软推荐用IHttpClientFactory来创建HttpClient。基本使用在启动方法中使用AddHttpClient来注册IHttpClientFactory。public void ConfigureServices(IServiceCollection s
本文主要介绍.NET Core(C#)中,使用HttpClientFactory(IHttpClientFactory)实现简单爬虫,执行GET和POST求的方法,以及相关的示例代码。 原文地址:https://www.cjavapy.com/article/723/
可以注册IHttpClientFactory并将其用于配置和创建应用中的HttpClient实例。IHttpClientFactory的优势如下: 提供一个中心位置,用于命名和配置逻辑HttpClient实例。例如,可注册和配置名为 github 的客户端,使其访问GitHub。可以注册一个默认客户端用于一般性访问。 通过HttpClient中的委托处理程序来编码出站...
关于HttpClient使用,个人在很多场景都派上用场了,比如在Winform或后台服务中用其调用接口获取和上传数据、微服务中用其进行各服务之间的数据共享等,到目前来看,似乎还没有出现过什么问题,但当我看到官方文档介绍使用方式时,再回顾之前项目的代码,只能说没出问题比较庆幸。 官方文档介绍的大概意思如下: HttpClient使用比较简单,但在某些情况下,许多开发人员却并未正确使用该类;虽然此类实现 IDisposable,但在 using 语句中声明和实例化它并非首选操作,因为释放 Ht
IHttpClientFactory 是由自 .NET Core 2.1 起可用的固定工厂 DefaultHttpClientFactory 实现的协定,用于创建在应用程序中使用HttpClient 实例。 .NET 中提供的原始 HttpClient 类的相关问题 常见的原始 HttpClient 类非常易于使用,但在某些情况下,许多开发人员却并未正确使用该类。 虽然此类实现 IDisposable,但在 using 语句中声明和实例化它并非首选操作,因为释放 HttpClient 对象时,基础套接字
一、为什么不用HttpClient 1.HttPClient使用完之后不会立即关闭开启网络连接时会占用底层socket资源,但在HttpClient调用其本身的Dispose方法时,并不能立刻释放该资源
一般来说我们发送Web求的时候,都是通过HttpClient。但是使用的时候会有两个问题: 因为HttpClient实现了IDisposable接口,每次使用如果都new一个对象的话,最后会耗尽你的主机端口。微软建议使用单例模式。 如果使用单例模式的话,端口是节省了,但是求地址的DNS如果改变了的话,这个单例并不知道。 为了解决上面的两个问题,社区就出现了HttpClientFactory...
当您想要在 .NET 中发送 HTTP 求时,可以使用 .NET 中内置的 `HttpClient` 类。这是一个非常方便的工具,可以让您轻松地发送 HTTP 求并接收响应。 下面是一个简单的例子,演示如何使用 `HttpClient` 发送 GET 求并读取响应内容: ```csharp using System.Net.Http; // 创建 HttpClient 实例 var client = new HttpClient(); // 发送 GET 求 var response = await client.GetAsync("https://www.example.com"); // 读取响应内容 var responseContent = await response.Content.ReadAsStringAsync(); 您也可以使用 `HttpClient` 发送其他类型的 HTTP 求,例如 POST、PUT 和 DELETE,只需调用相应的方法即可: ```csharp // 发送 POST 求 var content = new StringContent("request body"); var postResponse = await client.PostAsync("https://www.example.com", content); // 发送 PUT 求 var putResponse = await client.PutAsync("https://www.example.com", content); // 发送 DELETE 求 var deleteResponse = await client.DeleteAsync("https://www.example.com"); 需要注意的是,使用 `HttpClient` 发送求时应避免频繁创建新的 `HttpClient` 实例。建议的做法是在应用程序的生命周期内创建一个 `HttpClient` 实例,然后重复使用它。这样可以避免性能问题,同时也可以使用同一个 `HttpClient` 实例的身份验证凭据、Cookie 和其他信息。
Unable to preventDefault inside passive event listener due to target being treated as passive. 我也遇见了这个报错,但我是mousewheel事件触发的,这两个方法无效。 windows驱动注册中断服务程序 csphhh: 请教一个问题,如果一个设备有两个中断,中断A,中断B;对应中断程序isr1, isr2;那么在创建中断对象,查询Cmresource的时候,我该怎么确定哪个中断资源对应的中断A,哪个对应中断B呢 Blazor 从入门到放弃 qq6761212: @inject IJSRuntime JS 为啥在组件里用不了呢 group by 和 over(partition by)的区别 cillian_bao: 首先说明一下,第一点就是错的,mysql8.0早已支持开窗函数OVER java与C#的比较 hongerduohao: 观点过时了啊,建议用用最新的.net