Почему зависает сайт при работе с двух окон?

Всем привет!
У меня система на asp.net web forms. Для отображения некоторых страниц требуется выполнять довольно большие запросы к БД (например, формирование отчетов). Отчет открывается в новом окне, как бы позволяя пользователю работать в основном пока отчет формируется.
Но проблема в том, что как только на сервер отправлен запрос и пока сервер не ответит, то хоть 10 окон открой, но ни в одном не будет загружаться информация пока не будет получен ответ сервера из первого окна (где инициировали загрузку).
При этом, если открыть 2 браузера, то параллельно работает все нормально. Проблема только в рамках одного.
Как это лечить? И лечиться ли?
  • Вопрос задан
  • 179 просмотров
Пригласить эксперта
Ответы на вопрос 2
@dmitryKovalskiy
программист средней руки
На слух конечно такое решать сложно. Причина почему из разных браузеров работает скореее всего связана с тем что авторизация в разных браузерах инициирует разные идентификаторы сессий и фактически каждый пользователь живет своей жизнью что есть правильно.
Касательно основной задачи - проблема чисто архитектурная. Большие тяжелые SQL запросы нельзя выполнять синхронно с действиями пользователя. Как хотите обходите, но формирование отчета не может и не должно реализовываться через синхронный запрос. И нет - async/await ситуацию не исправит. Хотите делать визуальное представление данных - оптимизируйте запрос,денормализовывайте таблицы, стройте индексы, в общем разбирайтесь по query-plan что работает долго.
Некоторые расчеты можно предрасчитать заранее(хотя это большая редкость, но бывает).

Опять же вопрос - нужно ли пользователю весь набор данных отчета или только некая выжимка(топ-10 от чего-то). Если нужен весь - то может стоит реализовать через выгрузку в файл и почту, а не в интерфейс системы.
Ответ написан
Комментировать
Sanasol
@Sanasol
нельзя просто так взять и загуглить ошибку
https://blog.ksdaemon.ru/2010/12/podvisanie-veb-pr...

Если верить интернету, то в ASP.NET существует аналогичная проблема, потому как все запросы на сервер, работающие с сессией так же как и в PHP сериализуются, и обработка следующего запроса не начинается, пока не заканчивается предыдущий. Решается это установкой IReadOnlySessionState вместо IRequiresSessionState, в этом случае сессия не блокируется, и параллельный запрос (не зависимо от использования сессии) успешно обрабатывается.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы