У меня длительное (4-10 секунд) MVC-действие, которое запускает отчет из вызова AJAX. Пока он работает, пользователи могут изменять параметры и запускать что-то еще, поэтому я отменяю запрос AJAX, прежде чем сделать другой.
Так, например (например, в jQuery, но проблема возникает независимо):
// If we have an active request and it's not complete
if(dataRequest && dataRequest.readyState != 'complete')
{
dataRequest.abort();
}
dataRequest = $.ajax(...);
На стороне клиента это работает нормально, но отмененный запрос все еще выполняется на сервере. Например, если отчет занимает 10 секунд, а я отменяю один и запускаю другой, второй запрос занимает 20 секунд.
Я думаю, это связано с блокировкой уровня сеанса :
[Если] для одного и того же сеанса делается два одновременных запроса (с использованием
то же значение SessionID), первый запрос получает эксклюзивный доступ к
информация о сеансе. Второй запрос выполняется только после
Первый запрос завершен.
Таким образом, второй запрос не может получить доступ к сеансу, пока не завершится первый. Использование асинхронных действий MVC, по-видимому, не обходится без этого, поскольку действие все еще должно иметь возможность вносить изменения в сеанс.
Можно ли остановить одно действие и начать следующее без использования AsyncController
или [SessionState(SessionStateBehavior.ReadOnly)]
?
Если это не так, оба требуются?