Состояние сеанса, блокирующее асинхронный AJAX-вызов от одновременной обработки

Я пытаюсь сделать 6 асинхронных jQuery ajax-вызовов в мой метод.NET Page Method сразу на document.ready, чтобы запросить различные наборы данных из базы данных и в ответ вывести их в виде диаграмм для пользователей.

Проблема заключается в том, что когда генерация одного графика занимает много времени, он блокирует генерацию следующих 5 графиков, например, когда каждый график генерируется в течение 1 минуты, пользователь будет ждать приблизительно 6 минут вместо 1 - 2 минуты, которые я думал, что это будет при использовании асинхронных вызовов ajax и метода страницы обрабатывается параллельно.

Прочитав много полезных постов на этом форуме, я обнаружил, что это потому, что я должен читать и записывать объекты сеанса в методах страницы, а asp.net блокирует весь запрос, в результате чего они выполняются последовательно.

Я видел людей, предлагающих установить состояние сеанса только для чтения в теге @Page, но это не решит мою проблему, потому что мне нужно также записать сеанс. Я рассмотрел переход от сеанса inProc к сеансу базы данных sql, но мой объект сеанса не сериализуем и используется во всем проекте. Я также не могу перейти на использование Cache, потому что сеанс содержит специфические детали пользователя.

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

заранее спасибо

2 ответа

Решение

Исходя из моего личного опыта, переключение на сеанс SQL НЕ поможет в решении этой проблемы, поскольку все параллельные потоки будут блокироваться в SQL, поскольку первый поток будет удерживать монопольную блокировку одной или нескольких строк в базе данных.

Мне любопытно, почему ваш объект сеанса не сериализуем. Единственное решение, о котором я могу подумать, - это использовать таблицу базы данных для хранения пользовательских данных, которые вы храните в сеансе, а затем удерживать блокировку базы данных столько времени, сколько потребуется для обновления пользовательских данных.

В качестве ключа базы данных вы можете использовать идентификатор сеанса ASP.NET или другое уникальное значение cookie.

Проблема, возможно, не на стороне сервера вообще.

Браузеры имеют встроенный лимит на количество одновременных HTTP-запросов, которые они будут делать - это часть спецификации HTTP/1.1, которая предлагает ограничение в 2.

В IE7 ограничение равно 2. В IE8 оно равно 6. Но когда страница загружается, вы можете легко нажать 6 из-за одновременных запросов на CSS, JS, изображения и т. Д.

Хорошим источником информации об этих ограничениях является BrowserScope (см. Столбец "Соединения на имя хоста").

Как насчет объединения этих 6 запросов в 1 запрос? Это также будет загружаться немного быстрее.

Другие вопросы по тегам