c# - 由 HttpClientFactory 创建的长寿 HttpClient
问题描述
我读过HttpMessageHandlers
每 2 分钟回收一次,但我不确定是否将新的分配给现有的HttpClient
?
我已经通过使用进行了测试SetHandlerLifetime(TimeSpan.FromSeconds(5));
,即使在 2 分钟后有无数请求,httpClient 仍在继续工作,这是一个好兆头?
这是否意味着我不必担心 DNS 更改/套接字耗尽?
在ConfigureServices方法内部:
var myOptions = app.ApplicationServices.GetService<IOptionsMonitor<MyOptions>>();
HttpClient httpClient = app.ApplicationServices.GetService<IHttpClientFactory>().CreateClient();
MyStaticObject.Configure(myOptions, httpClient);
编辑:添加了一些示例代码。
解决方案
这里有几件事要看,第一件事MyStaticObject
实际上需要是静态的吗?如果是这样,我建议将其注册为单例,以便您仍然可以利用依赖注入。完成此操作后,您可以IHttpClientFactory
从代码中注册并使用它。您的ConfigureServices
方法可能最终看起来像这样
public void ConfigureServices(IServiceCollection services)
{
//The base extension method registers IHttpClientFactory
services.AddHttpClient();
services.AddSingleton<IMySingletonObject, MySingletonObject>();
}
然后在你的消费类中,MySingletonObject
在这种情况下,你可以这样配置它
public class MySingletonObject
{
private readonly IHttpClientFactory _clientFactory;
public MySingletonObject(IHttpClientFactory clientFactory)
{
_clientFactory = clientFactory;
}
public async Task SomeMethodThatUsesTheClient()
{
var client = _clientFactory.CreateClient();
//use the client
}
}
这样做的原因是它IHttpClientFactory
为我们处理了生命周期和池问题。根据文档:
管理底层 HttpClientMessageHandler 实例的池和生命周期。自动管理避免了手动管理 HttpClient 生命周期时发生的常见 DNS(域名系统)问题。
这发生在您进行CreateClient
调用时,因此您希望使用客户端在代码中执行此操作,而不是在应用程序启动时执行此操作。
作为旁注,如果您根本不需要这个类是单例,您可以使用扩展services.AddHttpClient<IMyClass, MyClass>()
并将一个HttpClient
直接注入到类中。DI 容器将在幕后为您处理从工厂获取客户端。
推荐阅读
- android - 如何在长按时控制 ActionMenuItem 的行为?
- javascript - 如何使用paypal智能按钮在产品缺货时无法付款
- python - 名称“REQUIRED_PERMISSIONS”未定义
- c++ - 更喜欢虚拟还是模板?
- php - 使用 laravel 动态对象记录保存到数据库中
- php - PHP 联系表单提交但不发送邮件
- android - 如何在 Android 中使用 Retrofit 获取内部 JSON 对象?(不是数组)
- algorithm - 使用 CIEDE2000 找到真正相反颜色的更好算法
- google-apps-script - 如何在 Google Apps 脚本中解析 Range 对象
- amazon-redshift - 有什么方法可以计算 Redshift 中条件的运行总计?