我正在考虑使用
IHttpClientFactory
在我的 ASP.NET Core 应用程序中调用外部 API。我见过一些在服务类的构造函数中创建客户端工厂的示例。然后该类的方法调用客户端工厂来生成 HttpClient
的实例来发出 HTTP 请求。就像下面的示例代码:
public class MyTransientService: IMyService
{
private readonly IHttpClientFactory _clientFactory;
public MyTransientService(
IHttpClientFactory clientFactory
)
{
_clientFactory = clientFactory;
}
public async Task<MyData> GetData()
{
//construct the request
var httpClient = _clientFactory.CreateClient();
var response = await client.SendAsync(request);
...
}
}
如果该服务在 Startup.cs 中注册为瞬态服务,那么每次调用该服务时是否都会生成一个新的
HttpClientFactory
实例?每个请求一个新的 HttpClientFactory
?那么以下不是更有效的使用工厂的方式吗?
public class MyTransientService: IMyService
{
private readonly HttpClient _client;
public MyTransientService(HttpClient client)
{
_client = client;
}
public async Task<MyData> GetData()
{
Uri uri = new Uri(StaticUtils.AddQueryString(url, props));
var response = await _client.SendAsync(request);
...
}
}
我认为自己创建 HttpClient 是一种不好的做法,您可以自行控制创建的数量。如果
MyTransientService
是暂时的,您最终将创建大量套接字连接(每个实例/请求一个) HttpClient
被创建以供重用。
public void ConfigureServices(IServiceCollection services)
{
services.AddHttpClient("hello", c =>
{
c.BaseAddress = new Uri("http://localhost:5000");
})
.AddTypedClient<MyTransientService>();
services.AddControllers();
}
public class MyTransientService: IMyService
{
private readonly HttpClient _client;
public MyTransientService(
HtpClient client
)
{
_client = client;
}
public async Task<MyData> GetData()
{
Uri uri = new Uri(StaticUtils.AddQueryString(url, props));
var response = await _client.SendAsync(request);
...
}
}