Сессии в асинхронном дизайне - PullRequest
10 голосов
/ 25 февраля 2011

Мы создаем веб-приложение с поддержкой AJAX, которое выполняет несколько асинхронных запросов к серверу. Каждый из этих запросов к серверу является долго выполняющимся серверным заданием, при котором каждый возвращает объект JSON обратно на html-страницу. Каждому из этих вызовов необходим доступ на чтение / запись к объекту Session.

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

PS: асинхронные вызовы - это вызовы PageMethod.

Являются ли сеансы "не" рекомендованными, в первую очередь, при использовании рядом с асинхронными вызовами. Любые другие предложения по проектированию этой модели асинхронного запроса будут высоко оценены.

Ответы [ 2 ]

9 голосов
/ 03 марта 2011

Спасибо всем, кто разместил ответы и комментарии на мой вопрос. Я суммирую свои выводы и решения, чтобы кто-то нашел это полезным.

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

  1. Изменен вызов PageMethod в HttpHandler, реализующий IReadOnlySessionState. (В моем случае вызову Ajax просто необходим доступ для чтения в объект Session)
  2. Клиентская JQuery выполняет Ajax-вызов на сервер HTTPHandler
  3. Директиву @Page EnableSessionState можно оставить по умолчанию (чтение / запись)

При использовании вышеуказанного решения возможны несколько асинхронных вызовов при каждом считывании вызова в объект сеанса

Для получения дополнительной информации о выполнении вызова Jquery для обработчика HTTP, возвращающего объект JSON, вот ссылка

1 голос
/ 25 февраля 2011

Я бы на самом деле согласился, что сеансы не рекомендуются при использовании асинхронных вызовов, фактически использование сеансов должно быть минимальным в любом случае. Большинство моих приложений вообще не используют сессионное состояние напрямую, за исключением того, что требуется для внутреннего пользования.

...