Мы столкнулись с некоторыми взаимоблокировками при работе с взаимосвязанным ASP.NET WebApis на одном сервере IIS. Мы хотели бы знать, является ли это каким-то ожидаемым поведением из-за размещения всех API-интерфейсов на одном и том же сервере и в том же пуле приложений, поскольку нам удалось избежать проблемы, переместив либо WebApi в другой пул; или если что-то не так с нашим кодом.
Для производства мы, вероятно, будем размещать API на разных серверах или пулах, но мы все же хотим понять, почему это происходит. Наша главная проблема заключается в том, что если это наш ошибочный код, проблема может быть воспроизведена в более широком масштабе, даже если настройка хостинга верна.
Мы создали небольшое решение для воспроизведения тупика, размещенного в GitHub.
Действия воспроизведения следующие:
- WebClient выполняет несколько запросов HTTP параллельно с WebApi1.
- WebApi1 выполняет HTTP-запрос к WebApi2.
- WebApi2 выполняет HTTP-запрос к WebApi3.
- WebApi3 просто возвращает строку.
Ожидаемое поведение будет заключаться в том, что все запросы в конечном итоге будут разрешены.
Фактическое поведение состоит в том, что некоторые запросы завершаются, а некоторые другие терпят неудачу из-за TaskCancelledException
, который, по-видимому, связан с таймингами запросов.
Единственная статья, которую я смог найти, которая, похоже, упоминает ту же проблему, - с 2014 года: " Не отправлять запросы ServerXMLHTTP или WinHTTP к тому же Server", я считаю, что это проблема, с которой мы сталкиваемся, как мы можем подтвердить это?
Контекст
Нам была назначена задача создать централизованный сервер аутентификации для нескольких внутренних API-интерфейсов компании, в которой мы работаем. Мы используем IdentityServer3 со ссылочными токенами, поэтому, когда некоторый API запрашивает второй API с использованием токенов ссылок, второй API будет запрашивать сервер аутентификации для проверки маркера, который воспроизводит проблему.
Я добавил тег IdentityServer, поскольку это может быть распространенной проблемой при передаче нескольких API-интерфейсов и использовании токенов ссылок. Пример в GitHub.