“错误”;执行函数时出现异常";来自Azure服务总线侦听器

“错误”;执行函数时出现异常";来自Azure服务总线侦听器,azure,azure-functions,azureservicebus,Azure,Azure Functions,Azureservicebus,我们使用Azure服务总线发布来自Xamarin移动应用程序的所有请求。Azure服务总线绑定到一个Azure功能,该功能在每次请求到达Azure服务总线时触发 我们发现,当我们发送超过一定大小的数据时,Azure函数会出现错误。我们最多可以发送800条记录而不会出现问题,但当我们发送>=850条记录时,会出现以下错误: 执行函数时发生[错误]异常: Functions.ServiceBusQueueTrigger。mscorlib:已引发异常 通过调用的目标。mscorlib:发生了一个或多个

我们使用Azure服务总线发布来自Xamarin移动应用程序的所有请求。Azure服务总线绑定到一个Azure功能,该功能在每次请求到达Azure服务总线时触发

我们发现,当我们发送超过一定大小的数据时,Azure函数会出现错误。我们最多可以发送800条记录而不会出现问题,但当我们发送>=850条记录时,会出现以下错误:

执行函数时发生[错误]异常: Functions.ServiceBusQueueTrigger。mscorlib:已引发异常 通过调用的目标。mscorlib:发生了一个或多个错误。 一项任务被取消

正在调用的服务是一个ASP.NET Web API RESTful服务,它将数据记录保存到数据库中。这根本不会产生任何错误

这是我的Azure函数代码

#r "JWT.dll"
#r "Common.dll"

using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using System.Net.Http;
using System.Net.Http.Headers;
using System.Text;
using Microsoft.ServiceBus.Messaging;

public static void Run(BrokeredMessage message, TraceWriter log)
{
    log.Info($"C# ServiceBus queue trigger function processed message: {message.MessageId}");

    if (message != null)
    {
        Common.Entities.MessageObjectEntity messageObject = message?.GetBody<Common.Entities.MessageObjectEntity>();
        string msgType = messageObject?.MessageType;
        var msgContent = messageObject?.MessageContent;
        log.Info($"Message type: {msgType}");

        double timestamp = (DateTime.UtcNow - new DateTime(1970, 1, 1)).TotalSeconds;
        string subscriber = "MYSUBSCRIBER";
        string privatekey = "MYPRIVATEKEY";
        Dictionary<string, object> payload = new Dictionary<string, object>()
        {
            {"iat", timestamp},
            {"subscriber", subscriber}
        };
        string token = JWT.JsonWebToken.Encode(payload, privatekey, JWT.JwtHashAlgorithm.HS256);

        using (var client = new HttpClient())
        {
            string url = $"http://myexamplewebservices.azurewebsites.net/api/routingtasks?formname={msgType}";
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue(subscriber, token);
            HttpContent content = new StringContent((string)msgContent, Encoding.UTF8, "application/json");
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json")); 
            var response = client.PostAsync(new Uri(url), content);

            if (response == null)
            {
                log.Info("Null response returned from request.");
            }
            else
            {
                if (response.Result.IsSuccessStatusCode && response.Result.StatusCode == System.Net.HttpStatusCode.OK)
                {
                    log.Info("Successful response returned from request.");
                }
                else
                {
                    log.Info($"Unsuccessful response returned from request: {response.Result.StatusCode}.");
                }
            }
        }
        log.Info("Completing message.");
    }
}
#r“JWT.dll”
#r“Common.dll”
使用制度;
使用System.Collections.Generic;
使用System.Threading.Tasks;
使用System.Net.Http;
使用System.Net.Http.Header;
使用系统文本;
使用Microsoft.ServiceBus.Messaging;
公共静态无效运行(BrokeredMessage消息、TraceWriter日志)
{
log.Info($“C#ServiceBus队列触发函数处理的消息:{message.MessageId}”);
如果(消息!=null)
{
Common.Entities.MessageObjectEntity messageObject=message?.GetBody();
字符串msgType=messageObject?.MessageType;
var msgContent=messageObject?.MessageContent;
log.Info($“消息类型:{msgType}”);
双时间戳=(DateTime.UtcNow-newdatetime(1970,1,1)).TotalSeconds;
string subscriber=“MYSUBSCRIBER”;
字符串privatekey=“MYPRIVATEKEY”;
字典负载=新字典()
{
{“iat”,时间戳},
{“订户”,订户}
};
string-token=JWT.JsonWebToken.Encode(有效负载,privatekey,JWT.JwtHashAlgorithm.HS256);
使用(var client=new HttpClient())
{
字符串url=$”http://myexamplewebservices.azurewebsites.net/api/routingtasks?formname={msgType}”;
client.DefaultRequestHeaders.Authorization=新的AuthenticationHeaderValue(订户、令牌);
HttpContent=new-StringContent((string)msgContent,Encoding.UTF8,“application/json”);
client.DefaultRequestHeaders.Accept.Add(新的MediaTypeWithQualityHeaderValue(“应用程序/json”);
var response=client.PostAsync(新的Uri(url)、内容);
如果(响应==null)
{
Info(“请求返回的响应为空”);
}
其他的
{
if(response.Result.issucessstatuscode&&response.Result.StatusCode==System.Net.HttpStatusCode.OK)
{
log.Info(“从请求返回的成功响应”);
}
其他的
{
log.Info($“从请求返回的响应不成功:{response.Result.StatusCode}”);
}
}
}
log.Info(“完成消息”);
}
}
这段代码已经运行了好几年,适用于我们所有的其他应用程序/网站

当我们将大量数据发布到我们的Azure服务总线/Azure功能时,您知道为什么会出现错误吗

这可能是由“new httpclient”引起的,系统打开新套接字的速度是有限的,因此如果耗尽连接池,可能会出现一些错误。您可以参考此链接:

请您再分享一些错误消息好吗?

这可能是由“new httpclient”引起的,系统打开新套接字的速度有限制,因此,如果耗尽连接池,您可能会遇到一些错误。您可以参考此链接:


您能再分享一些错误消息吗?

我可以看到您正在为每个可能导致此问题的请求创建httpclient连接。Httpclient在其下面创建一个套接字连接,并对其进行硬限制。即使当你处理它时,它仍会在那里停留几分钟,无法使用。一个好的实践是创建单个静态httpclient连接并重用它。我附上一些文件供你审阅。

我可以看到您正在为每个可能导致此问题的请求创建httpclient连接。Httpclient在其下面创建一个套接字连接,并对其进行硬限制。即使当你处理它时,它仍会在那里停留几分钟,无法使用。一个好的实践是创建单个静态httpclient连接并重用它。我附上一些文件供你审阅。

是否要共享您的AZFunction代码?@ImranArshad已更新以包含代码示例我已发布了我的答案,并在下面进行了解释。可能是httpclient的问题您想分享您的AZFunction代码吗?@ImranArshad已更新以包含代码示例我已发布了我的答案,并在下面进行了解释。httpclient可能就是问题所在。请求仍然会导致对服务的一次调用。不同之处在于请求的大小越来越大。所以我不是提出多个请求,而是提出更大的请求。服务的有效负载包括一个项目列表,随着要处理的请求发送更多数据,这些项目的列表会越来越大。实际上,我指的是代码中的httpclient。这就是调用AzureWebsiteAPI。您没有使用静态httpclient,我共享的文档也没有提到这个问题。你肯定需要调查这一点,这可能是这个问题的原因。我想有600个插座的限制,然后它就会失败。另一方面,您使用的是哪种服务总线sku?标准或溢价。您发送的数据有多大?我以为我们