我正在对API进行一些呼叫,该API同步并从我的应用程序和邮件议程中保存约会,这是最常见的Outlook邮件。对API的呼叫是由Web应用程序进行的,并且可以工作一段时间,但是几个小时后,呼叫失败了。这持续了一段时间,并在一段时间后开始再次工作。
DefaultConnectionLimit在开始时设置为100,在这种情况下,该过程在一段时间后停止工作(例如30分钟到1小时(。然后,DefaultConnectionLimit设置为20,在这种情况下,它可以正常工作3-4小时,然后停止工作。我不知道这是否是实际原因,但只是提到。
下面提到了从Web应用程序进行API调用的代码:
public bool SyncNewAppToExch(string encryptedAppSyncDetails)
{
try
{
string result = string.Empty;
JArray paramList = new JArray();
paramList.Add(encryptedAppSyncDetails);
var emailApiUrl = ConfigurationManager.AppSettings["emailApiUrl"].ToString();
Uri baseAddress = new Uri(emailApiUrl);
var url = "/api/EmailProcess/ManualSaveAppointments";
HttpClient client = new HttpClient();
client.BaseAddress = baseAddress;
client.DefaultRequestHeaders.Accept.Clear();
client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
Task.Run(() => client.PostAsJsonAsync(url, paramList)).Wait(5000);
var responseMessage = true;
if (responseMessage)
return true;
else
return false;
}
catch (Exception ex)
{
return false;
}
}
遵循API调用故障的例外读取:
异常:system.AggregateException:发生一个或多个错误。system.threading.tasks.taskCanceLedException:取消任务。---内部异常堆栈跟踪的结尾---在system.threading.tasks.task1.getResultCore(boolean waitcompletionnotification(at system.threading.tasks.tasks.tasks.tasks.taskss.taskss.task1.get_result((
如果您每次要拨打呼叫时都会制作一个新的HTTPCLIENT对象,则您的使用不适当。即使不再使用插座,HTTPClient也可能会继续使用插座,这可能会导致负载下的插座耗尽。您可以在此处看到有关此主题的更多信息
您应该创建一个实例并重复使用。如果您使用的是.NET核心,那么使用HTTPClientFactory是一个更好的主意。
此外,使用task.run调用异步方法是不明智的。您正在为僵局准备自己准备。如果可能的话,将您的方法标记为异步和等待,最好。由于您实际上是在做火和忘记,因此如果您的应用域关闭此工作将丢失,那么您完成此操作的方式。
如果您需要执行此操作,则至少应该考虑以这样的方式注册您的任务:
hostingenvironment.queuebackgroundworkitem(ct => sendmailasync(user.email((;
简短的答案是,很难说出您的问题是什么,这可能是几个问题之一。