我们使用 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功能时,为什么会出错?
答案 0 :(得分:1)
这可能是由“新的httpclient”引起的,系统打开新套接字的速度受到限制,因此,如果耗尽连接池,可能会遇到一些错误。您可以参考以下链接:https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/
您能再分享一些错误消息吗?
答案 1 :(得分:1)
我可以看到您正在为每个请求创建httpclient连接,这可能导致此问题。 Httpclient在其下面创建一个套接字连接,并对其具有硬限制。即使将其丢弃,它也会在此处停留几分钟,这是无法使用的。一个好的做法是创建单个静态httpclient连接并重用它。我附上一些文件供您查阅。 AzFunction Static HttpClient,Http Client Working,Improper instantiation