来自Azure Service Bus侦听器的错误“执行函数时出现异常”

时间:2019-09-03 15:50:40

标签: azure azure-functions azureservicebus

我们使用 Azure服务总线 Xamarin移动应用发布所有请求。 Azure服务总线已绑定到 Azure功能,该功能会在每次请求点击 Azure Service Bus 时触发。

我们发现,当我们发送一定大小的数据时,此 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.");
    }
}

此代码已经使用了几年了,并且可以在我们所有其他应用/网站上使用。

在将大量数据发布到 Azure服务总线 / Azure功能时,为什么会出错?

2 个答案:

答案 0 :(得分:1)

这可能是由“新的httpclient”引起的,系统打开新套接字的速度受到限制,因此,如果耗尽连接池,可能会遇到一些错误。您可以参考以下链接:https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/

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

答案 1 :(得分:1)

我可以看到您正在为每个请求创建httpclient连接,这可能导致此问题。 Httpclient在其下面创建一个套接字连接,并对其具有硬限制。即使将其丢弃,它也会在此处停留几分钟,这是无法使用的。一个好的做法是创建单个静态httpclient连接并重用它。我附上一些文件供您查阅。 AzFunction Static HttpClientHttp Client WorkingImproper instantiation