Вызов API завершается ошибкой через некоторое время, когда несколько пользователей вошли в систему и используют приложение. Есть ли способ решить это? - PullRequest
1 голос
/ 01 мая 2019

Я звоню в API, который синхронизирует и сохраняет встречи в / из моего приложения и почтовой программы, которая чаще всего является почтой Outlook.Звонки в API осуществляются из веб-приложения, и в течение некоторого времени он работает нормально, но затем, сразу через несколько часов, звонки не выполняются.Это продолжается некоторое время и снова начинает работать через некоторое время.

В начале для DefaultConnectionLimit было установлено значение 100, и в этом сценарии процесс через некоторое время перестал работать (например, от 30 минут до 1 часа).Тогда DefaultConnectionLimit был установлен в 20, и в этом случае он работал нормально в течение 3-4 часов и перестал работать после этого.Я не знаю, является ли это действительной причиной, но просто упомяну.

Код, где выполняется вызов 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) в System.Threading.Tasks.Task1.get_Result ()

1 Ответ

0 голосов
/ 01 мая 2019

Если вы создаете новый объект HttpClient каждый раз, когда хотите выполнить вызов, вы не используете его надлежащим образом.HttpClient может продолжать использовать сокеты, даже если он больше не используется, и это может вызвать истощение сокетов под нагрузкой. Вы можете увидеть больше по этой теме здесь

Вы должны создать один экземпляр и использовать его повторно.Если вы используете ядро ​​.Net, было бы лучше использовать HttpClientFactory.

Кроме того, использование Task.Run для вызова асинхронного метода нецелесообразно. Вы настраиваете себя на тупик. Было бы намного лучше пометить ваш метод как асинхронный и ожидать, если это возможно.Поскольку вы эффективно запускаете огонь и забываете, то способ, которым вы сделали это, если ваш домен приложений закрывает эту работу, будет потерян.

Если вам нужно это сделать, вам следует, по крайней мере, рассмотреть возможность регистрации своей задачи как таковой.:

HostingEnvironment.QueueBackgroundWorkItem (ct => SendMailAsync (user.Email));

Короткий ответ: трудно сказать, в чем заключается ваша проблема, это может быть одной из нескольких проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...