我们使用Azure 服务总线发布来自Xamarin 移动应用的所有请求。Azure服务总线绑定到 Azure 函数,每次请求命中Azure 服务总线时都会触发该函数。
我们发现,当我们发送超过特定大小的数据时,我们会收到来自此Azure 函数的错误。我们最多可以毫无问题地发送 800 条记录,但是当我们发送>=850 条记录时,我们收到以下错误:
[错误] 执行函数时出现异常: mscorlib:已抛出异常 按调用的目标。mscorlib:发生了一个或多个错误。 任务已取消。
正在调用的服务是一个ASP.NET Web APIRESTful 服务,它将数据记录保存到数据库中。这根本不会产生任何错误。
这是我的 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 函数时出现错误?
它可能是由"new httpclient"引起的,系统打开新套接字的速度是有限制的,因此如果耗尽连接池,可能会遇到一些错误。您可以参考此链接:https://aspnetmonsters.com/2016/08/2016-08-27-httpclientwrong/
你能分享更多错误消息吗?
我可以看到您正在每个可能导致此问题的请求上创建httpclient连接。Httpclient在其下方创建一个套接字连接,并对其进行硬限制。即使你处理它,它也会在那里停留几分钟,无法使用。一个好的做法是创建单个静态 httpclient 连接并重用它。我附上一些文件供你通过。 AzFunction 静态 Http客户端,http 客户端工作,实例化不当