首页 > 解决方案 > 通过 DI 注入到 ServiceBusTrigger Azure 函数中的 IHttpClientFactory 是否为每个触发器重用或重新创建?

问题描述

我有一个带有一个 ServiceBusTrigger 的 Azure Function 项目。随着消息被添加到服务总线队列中,这可能会在短时间内迅速触发。据我了解,当将 IHttpClientFactory 注入 Azure Functions 项目时,工厂将暂时添加,即我的理解是每个函数执行一次。

据我从文档中可以看出,这并不理想 - 对于这样的函数,我当然希望每次触发函数方法时都可以重用一个 HttpClientFactory,然后通过 httpClientFactory.CreateClient() 创建 HttpClients,对吗?恐怕通过 DI 暂时添加 IHttpClientFactories,它们将各自使用自己的连接池,进而可能会淹没连接限制。

谁能告诉我我是否理解正确,如果理解正确,我该怎么做才能解决这个问题?

提前致谢。

标签: c#.net-coredependency-injectionazure-functionsdotnet-httpclient

解决方案


IHttpClientFactory添加时被注册为单例, services.AddHttpClient()因此它被共享而不是每次都重新创建。在此处检查代码

关于HttpClient对象创建 - 查看 Microsoft 的文档 -此处

问题不在于 HttpClient 本身,而在于 HttpClient 的默认构造函数,因为它创建了一个新的具体实例HttpMessageHandler,该实例存在套接字耗尽和 DNS 更改问题。

为了解决上述问题并使HttpClient实例易于管理,.NET Core 2.1 引入了IHttpClientFactory可用于HttpClient通过依赖注入 (DI) 在应用程序中配置和创建实例的接口,该接口管理生命周期HttpMessageHandler以避免上述问题/问题在管理生命周期时可能会发生HttpClient

在内部,每次HttpClient要求从 IHttpClientFactory 创建对象时,都会返回一个新实例。但是,只要生命周期没有过期,每个人都会HttpClient使用一个HttpMessageHandler由 池化和重用的资源来减少资源消耗。IHttpClientFactoryHttpMessageHandler's

阅读上述链接中的详细好处。


推荐阅读