C# 通过DI注入ServiceBusTrigger Azure函数的IHttpClientFactory是否为每个触发器重用或重新创建?
我有一个带有一个ServiceBustigger的Azure功能项目。当消息添加到服务总线队列时,这可能会在短时间内快速触发。我的理解是,在将IHttpClientFactory注入Azure Functions项目时,工厂将临时添加,这是我的理解,即每次函数执行一次 从文档中可以看出,这并不理想-对于这样的函数,我当然希望每次触发函数方法时都有一个HttpClientFactory重用,然后通过HttpClientFactory.CreateClient()创建HttpClient,对吗?我担心,通过DI临时添加IHTTPClientFactory,它们将各自使用自己的连接池,从而可能会淹没连接限制 谁能告诉我我是否理解正确,如果我理解正确,我能做些什么来解决这个问题C# 通过DI注入ServiceBusTrigger Azure函数的IHttpClientFactory是否为每个触发器重用或重新创建?,c#,.net-core,dependency-injection,azure-functions,dotnet-httpclient,C#,.net Core,Dependency Injection,Azure Functions,Dotnet Httpclient,我有一个带有一个ServiceBustigger的Azure功能项目。当消息添加到服务总线队列时,这可能会在短时间内快速触发。我的理解是,在将IHttpClientFactory注入Azure Functions项目时,工厂将临时添加,这是我的理解,即每次函数执行一次 从文档中可以看出,这并不理想-对于这样的函数,我当然希望每次触发函数方法时都有一个HttpClientFactory重用,然后通过HttpClientFactory.CreateClient()创建HttpClient,对吗?我担
提前感谢。
IHttpClientFactory
在通过服务添加时注册为singleton。AddHttpClient()
因此它将被共享,而不是每次重新创建。检查代码
关于HttpClient
对象创建-查看Microsoft提供的文档-
问题实际上并不在于HttpClient本身,而是在于HttpClient的默认构造函数,因为它创建了HttpMessageHandler
的一个新的具体实例,该实例存在套接字耗尽和DNS更改问题
为了解决上述问题并使HttpClient
实例易于管理,.NET Core 2.1引入了IHttpClientFactory
接口,该接口可用于通过依赖项注入(DI)在应用程序中配置和创建HttpClient
实例它管理HttpMessageHandler
的生存期,以避免在管理HttpClient
生存期时可能出现的上述问题
在内部,每次要求从IHttpClientFactory创建HttpClient
对象时,都会返回一个新实例。但是每个HttpClient
都使用一个HttpMessageHandler
,只要HttpMessageHandler的
生存期没有过期,它就会被IHttpClientFactory
汇集和重用,以减少资源消耗
阅读上述链接中的详细好处。是的,但IHTTPClientFactory不是为每个函数执行实例自行创建的吗?所有IHTTPClientFactory是否都以线程安全的方式处理HttpMessageHandler,或者HttpMessageHandler的唯一实例是否链接到每个IHTTPClientFactory?如何添加
HttpClient
?via-services.AddHttpClient()代码>?如果是这样的话,那么它不是作为单例实例注入的吗?我通过Startup.cs:services.AddHttpClient()添加它-是的。然后在function类中,我注入一个IHttpClientFactory作为构造函数参数。然后我从函数中的_httpClientFactory.CreateClient()获取HttpClients,该函数有一个[ServiceBusTrigger](这可以在短时间内触发多次)。是否所有触发器执行都将共享_httpClientFactory对象?或者他们都会有自己的_httpClientFactory对象吗?要回答标题本身的问题,IHttpClientFactory
默认注册为singleton,因此工厂实例本身将被共享。谢谢。我在其他地方读到过,它是瞬间产生的,但我想情况并非如此。