2015-09-18 3 views
0

У меня есть существующий метод внутри контроллера веб-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

+0

P.S. Если вы поставили точку останова в строке 16 AsyncHelper, вы найдете следующее: - При запуске внутри контроллера веб-API - task.Status == WaitingForActivation - При запуске внутри модуля test - task.Status == RanToCompletion –

ответ

0

Я решил его! WebAPIAsyncWorking.zip

По существу - все вызовы ждут, необходимые для вызова метода .ConfigureAwait (false), чтобы обеспечить его продолжение в другом контексте.

Для дальнейшего использования я загрузил рабочее решение здесь ....