У меня есть существующий метод внутри контроллера веб-API, который возвращает данные из внутреннего api. Этот метод в настоящее время занимает около 6 секунд для завершенияWeb API Async Timeout
Мне нужно адаптировать этот метод для отправки до 4 запросов внешнему API и последующего сохранения результатов в базе данных.
Каждый вызов внешнего API занимает около 2-3 секунд.
Несмотря на то, что вызов внешнего API очень важен, я не могу отсрочить работу пользователя. Поэтому вызов внешнего апи синхронно не является вариантом, так как он может занять 3 секунды на вызов * 4 = 12 секунд, а затем придется вызывать внутренний апи (5 секунд) = 17 секунд всего
Для решения этой проблемы были сделаны следующие изменения:
сделать метод Web API асинхронной Создайте метод, который вызывает внешний API асинхронно и возвращает задачу
--- ПЕРЕД ВЫЗОВ ВНУТРЕННЕГО API мЕТОД Вызвать метод 4 раза, добавляя результат в список Создайте тайм-аут, используя Task.Delay() в течение 5 секунд;
- ВЫЗВАТЬ ВНУТРЕННЕГО API МЕТОД
Loop через список задач вызовов task.WhenAny (задача, timeoutTask) Если timeoutTask завершена, и задача не завершена, то он превысил ожидания , поэтому прекращение обработки.
Чтобы продемонстрировать проблему, я создал новый проект ASP.NET MVC Web Api и добавил эквивалентный код методу Index() на HomeController.
Я также добавил класс AsyncUnitTests.cs, который имеет тот же код, что и метод Web API.
Странная вещь, что модульный тест работает так, как я ожидал бы, и веб-ави зовут нет.
У кого-нибудь есть идеи?
Пример применения: WebAPIAsync.zip
P.S. Если вы поставили точку останова в строке 16 AsyncHelper, вы найдете следующее: - При запуске внутри контроллера веб-API - task.Status == WaitingForActivation - При запуске внутри модуля test - task.Status == RanToCompletion –