在同一类的不同方法中重用通过HttpClientFactory创建的httpClient?(C#/.NET)



我有一个类,通过构造函数将IHttpClientFactory注入其中。这个类中还有一个HttpClient私有字段。

在构造函数中创建HttpClient,使用工厂,然后在同一个类中的两个/多个方法中重用该HttpClient,以进行两个或多个不同的api调用,是否存在任何问题?(相同的Api,不同的终点(

或者,在每种方法中使用工厂来创建一个新的客户端会更好吗。影响/优点和优点是什么;每种方法的缺点?有谁天生就更好吗?

private readonly HttpClient _httpClient;
public RestClient(IHttpClientFactory httpClientFactory)
{
_httpClient = httpClientFactory.CreateClient();
}
public async Task<SomeResponse> Method1(SomeRequest request)
{
...
using (var httpRequestMessage = new HttpRequestMessage(HttpMethod.Post, url))
{
httpRequestMessage.Headers.Add("Accept", "application/json");
httpRequestMessage.Headers.Add("Authorization", "Basic " + credentials);
httpRequestMessage.Content = new StringContent(jsonBody, Encoding.UTF8, "application/json");
using (var response = await _httpClient.SendAsync(httpRequestMessage))
{
...
}
}
...
}
public async Task<SomeOtherResponse> Method2(someInput)
{
...
using (var httpRequestMessage = new HttpRequestMessage(HttpMethod.Get, uri.ToString()))
{
httpRequestMessage.Headers.Add("Accept", "image/png");
httpRequestMessage.Headers.Add("Authorization", "Basic " + credentials);
using (var response = await _httpClient.SendAsync(httpRequestMessage))
{
...
}
}
...
}

编辑:已经看过这篇文章了。我应该缓存并重用从HttpClientFactory创建的HttpClient吗?但它不能回答我的问题。如果有什么东西可以从那里得到,请解释。

我认为您正在从Microsoft寻求此指南:使用HttpClient 的指南

我在这里复制相关部分

推荐使用

在.NET Core和.NET 5+中:

根据预期的DNS更改,使用static单例HttpClient实例,并将PooledConnectionLifetime设置为所需的间隔,例如两分钟。这在不增加IHttpClientFactory开销的情况下解决了套接字耗尽和DNS更改问题。如果你需要能够模拟你的处理程序,你可以单独注册它。

使用IHttpClientFactory,您可以针对不同的用例拥有多个不同配置的客户端。但是,请注意,工厂创建的客户端是短暂的,一旦创建了客户端,工厂就不再控制它。

工厂对HttpMessageHandler实例进行池化,如果其生存期尚未到期,则在工厂创建新的HttpClient实例时,可以从池中重用处理程序。这种重用避免了任何套接字耗尽问题。

如果您想要IHttpClientFactory提供的可配置性,我们建议您使用类型化客户端方法。

在.NET Framework中:

使用IHttpClientFactory来管理您的HttpClient实例。如果为每个请求创建一个新的客户端实例,则可以耗尽可用的套接字。

提示

如果您的应用程序需要cookie,请考虑禁用自动cookie处理或避免IHttpClientFactory。对HttpMessageHandler实例进行池化导致CookieContainer对象的共享。未预料到的CookieContainer对象共享通常会导致错误的代码。

最新更新