我有一个类,通过构造函数将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
对象共享通常会导致错误的代码。