0

Мы создали веб-службу, которая загружает данные из внешнего API. Стандартная страница содержит 6-8 модулей, все данные по загрузке из разных ресурсов API. Это выглядит так (каждый блок загружается с другого URL-адреса, например,/cars,/phones,/games ... enter image description hereC# Web API - Блокировка

Один вызов внешнего API может занять примерно 10-15 секунд (не совсем необычно) ...

При загрузке страницы каждый блок будет запускать вызов Ajax с помощью jQuery (мы используем магистраль), который запрашивает наш собственный API (он как прокси, только перенаправляет вызов на внешний API) для данных.

С самого начала мы подумали: «Ах, хорошо, ajax решит все наши проблемы» ... и это происходит на стороне клиента ... Однако мы не используем async или что-то подобное на стороне сервера, поэтому Я думаю, вы можете видеть, что t проблем, с которыми мы сталкиваемся ... это правильно, блокируя потоки.

Из-за этого у нас не может быть более 2-3 одновременных пользователей. Мы используем C# MVC вместе с Web Api, а на интерфейсе мы используем Backbone.

Мой вопрос: будут ли асинхронные контроллеры решать наши проблемы? Или мы должны реализовать это по-другому? Некоторые из вас скажут: «Просто кешируйте данные, и все будет хорошо». И да, мы кэширование данных, но он все равно будет блокировать все нити (не так долго, как первый запрос, но все же заметно)

я вижу довольно много различных решений для этого:

  • Обратный ajax - как http://pokein.com/?
  • SignalR? http://www.asp.net/signalr
  • Асинхронные контроллеры (с асинхронными методами Thats получения данных, конечно ...)

Итак, что же вы, ребята, рекомендуем?

Кроме того, я нашел это: Why is my async ASP.NET Web API controller blocking the main thread? Где ответ, предполагающий, что это проблема с самим браузером, что он не разрешает множественные одновременные вызовы перед получением ответа от первого запроса?

ответ

1

Решение было очень простым. На моем базовом контролере я поместил этот атрибут: SessionState (SessionStateBehavior.Disabled)

ASP.NET ставит блокировку для всех запросов, а это означает, что если вы выполняете параллельные запросы, они не будут работать параллельно.

Подробнее об этом можно узнать в this article from Microsoft.

Доступ к ASP.NET состояние сеанса исключительно на сессии, что означает , что если два разных пользователей делают параллельные запросы, доступ к каждой отдельной сессии предоставляется одновременно. Однако, если два одинаковых запроса сделаны для одного и того же сеанса (с использованием того же значения SessionID ), первый запрос получает эксклюзивный доступ к информации сеанса . Второй запрос выполняется только после завершения первого запроса .(Вторая сессия также может получить доступ, если блокировка исключительной информации освобождена, поскольку первый запрос превышает тайм-аут блокировки .)

Смежные вопросы