正确使用 IHttpClientFactory 进行 .net-core 瞬态服务
Correct usage of IHttpClientFactory for a .net-core transient service
我正在考虑使用 IHttpClientFactory 在我的 asp.net 核心应用程序中调用外部 API。我见过几个例子,其中客户端工厂是在服务 class 的构造函数中创建的。然后那个 class 的方法调用那个客户端工厂来生成一个 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中被注册为transient,每次调用服务时是否都会生成一个新的HttpClientFactory实例?每个请求一个新的 HttpClientFactory?那么下面的方法不是更有效地使用工厂吗?
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);
...
}
}
我会考虑自己创建 HttpClient 的坏习惯,您可以自行控制创建的数量。如果 MyTransientService
是瞬态的,您将最终创建大量套接字连接(每个 instance/request 一个)创建 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);
...
}
}
我正在考虑使用 IHttpClientFactory 在我的 asp.net 核心应用程序中调用外部 API。我见过几个例子,其中客户端工厂是在服务 class 的构造函数中创建的。然后那个 class 的方法调用那个客户端工厂来生成一个 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中被注册为transient,每次调用服务时是否都会生成一个新的HttpClientFactory实例?每个请求一个新的 HttpClientFactory?那么下面的方法不是更有效地使用工厂吗?
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);
...
}
}
我会考虑自己创建 HttpClient 的坏习惯,您可以自行控制创建的数量。如果 MyTransientService
是瞬态的,您将最终创建大量套接字连接(每个 instance/request 一个)创建 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);
...
}
}