C# 如何处理对azure服务总线的多次访问

C# 如何处理对azure服务总线的多次访问,c#,azure,azure-functions,azureservicebus,C#,Azure,Azure Functions,Azureservicebus,我的应用程序正在使用Azure Service Bus存储消息。我有一个名为httptriggerenquiue的Azure函数,它允许我将消息排队。问题是这个函数可以在很短的时间间隔内被调用数百次。当我调用HttpTriggerEnqueue一次、两次、10次或50次时,一切正常。但当我调用它200、300次(这是我的用例)时,我得到了一个错误,并不是所有消息都排队。从函数门户中,我得到以下错误 threshold exceeded [connections] 我尝试了.NETSDK和HTT

我的应用程序正在使用Azure Service Bus存储消息。我有一个名为
httptriggerenquiue
的Azure函数,它允许我将消息排队。问题是这个函数可以在很短的时间间隔内被调用数百次。当我调用
HttpTriggerEnqueue
一次、两次、10次或50次时,一切正常。但当我调用它200、300次(这是我的用例)时,我得到了一个错误,并不是所有消息都排队。从函数门户中,我得到以下错误

threshold exceeded [connections]
我尝试了.NETSDK和HTTP请求。这是我的密码

HTTP请求:

试试看
{
变量排队=”https://.servicebus.windows.net//messages";
var client=new-HttpClientHandler(){AutomaticDecompression=DecompressionMethods.Deflate | DecompressionMethods.GZip});
var request=newhttprequestmessage(HttpMethod.Post,ENQUEUE);
client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
var sasToken=SASTokenGenerator.GetSASToken(
"https://.servicebus.windows.net//",
"",
"",
TimeSpan.FromDays(1)
);
client.DefaultRequestHeaders.TryAddWithoutValidation(“Authorization”,sasToken);
request.Content=newstringcontent(message,Encoding.UTF8,“application/json”);
request.Headers.AcceptEncoding.Add(新的StringWithQualityHeaderValue(“gzip”);
request.Headers.AcceptEncoding.Add(新的StringWithQualityHeaderValue(“deflate”);
var res=await client.sendaync(请求);
}
捕获(例外e){}
以及使用SDK的代码:

var qClient=QueueClient.CreateFromConnectionString(MyConnectionString,MyQueueName);
var bMessage=新代理消息(消息);
qClient.Send(b消息);
qClient.Close();
我有Azure上的标准层定价。
如果我在一小段时间内调用该函数300次(例如),就会得到错误。如何解决?

您应该使用从Azure功能向服务总线发送消息。它将为您处理连接管理,所以您不应该出现此类错误。

您应该使用它从Azure功能向服务总线发送消息。它将为您处理连接管理,因此您不应该出现此类错误。

这里的实际问题不是服务总线绑定(尽管您应该遵循@Mikhail给出的建议),这是HttpClient的一个众所周知的问题。您不应该在每次函数调用时都重新创建HttpClient。将其存储在静态字段中,以便可以重用。主要的一点是,除非您重构它以使用HttpClient的单个实例,否则您将继续运行端口耗尽

从:


HttpClient旨在实例化一次,并在应用程序的整个生命周期中重复使用。特别是在服务器应用程序中,为每个请求创建一个新的HttpClient实例将耗尽重载下可用的套接字数量。这将导致SocketException错误。

这里的实际问题不是服务总线绑定(尽管您应该遵循@Mikhail给出的建议),这是HttpClient的一个众所周知的问题。您不应该在每次函数调用时都重新创建HttpClient。将其存储在静态字段中,以便可以重用。主要的一点是,除非您重构它以使用HttpClient的单个实例,否则您将继续运行端口耗尽

从:


HttpClient旨在实例化一次,并在应用程序的整个生命周期中重复使用。特别是在服务器应用程序中,为每个请求创建一个新的HttpClient实例将耗尽重载下可用的套接字数量。这将导致SocketException错误。

谢谢,这似乎非常适合me@Mikhail虽然使用服务总线绑定肯定会清理您的代码,但请参阅我的答案,因为这里的根本问题在于HttpClient,而不是服务Bus@JesseCarter是的,这就是我所说的“连接管理”,也许我应该进一步阐述这一点。谢谢澄清!抱歉,如果我删除了已接受的答案。你的建议很有用,但我只是尝试了一下,实际上并没有解决问题。我认为@JesseCarter所说的实际问题是,我们的解决方案实际上是有效的。它似乎不起作用,因为我在本地尝试函数,每个函数都用了大约40000毫秒来完成。但是当我把这个项目发布到Azure上时,响应时间降到了40毫秒。谢谢你,这对我来说似乎是完美的me@Mikhail虽然使用服务总线绑定肯定会清理您的代码,但请参阅我的答案,因为这里的根本问题在于HttpClient,而不是服务Bus@JesseCarter是的,这就是我所说的“连接管理”,也许我应该进一步阐述这一点。谢谢澄清!抱歉,如果我删除了已接受的答案。你的建议很有用,但我只是尝试了一下,实际上并没有解决问题。我认为@JesseCarter所说的实际问题是,我们的解决方案实际上是有效的。它似乎不起作用,因为我在本地尝试函数,每个函数都用了大约40000毫秒来完成。但是当我把这个项目发布到Azure上时,响应时间降到了40毫秒,谢谢你的澄清。然而,我想使用@Mikhail建议的服务总线输出绑定。有没有办法使用输出绑定来避免插座耗尽?谢谢您的澄清。然而,我想使用@Mikhail建议的服务总线输出绑定。有没有办法使用输出绑定来避免插座耗尽?