Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/264.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 通过DI注入ServiceBusTrigger Azure函数的IHttpClientFactory是否为每个触发器重用或重新创建?_C#_.net Core_Dependency Injection_Azure Functions_Dotnet Httpclient - Fatal编程技术网

C# 通过DI注入ServiceBusTrigger Azure函数的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,对吗?我担

我有一个带有一个ServiceBustigger的Azure功能项目。当消息添加到服务总线队列时,这可能会在短时间内快速触发。我的理解是,在将IHttpClientFactory注入Azure Functions项目时,工厂将临时添加,这是我的理解,即每次函数执行一次

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

谁能告诉我我是否理解正确,如果我理解正确,我能做些什么来解决这个问题


提前感谢。

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,因此工厂实例本身将被共享。谢谢。我在其他地方读到过,它是瞬间产生的,但我想情况并非如此。