Очередь запросов сеанса ASP.net
Мне кажется, что ASP.net ставит в очередь все запросы, которые используют один и тот же идентификатор сеанса. Скажем, у вас 3 страницы.
Default.aspx
protected void Page_Load(object sender, EventArgs e)
{
Session["asdf"] = "LOLZ";
}
Нажатие этой страницы, очевидно, создаст новый сеанс, если он не существует.
X-AspNet-Version: 2.0.50727
Set-Cookie: ASP.NET_SessionId=ibjphuv0aiafqi453tyze345; path=/; HttpOnly
Затем вы нажмете Hang.aspx
protected void Page_Load(object sender, EventArgs e)
{
Thread.Sleep(10000);
}
И сразу же после того, как вы нажмете любую другую страницу, на которую будет передан этот идентификатор сеанса, не имеет значения, делает ли она что-либо, позвоните в Test.aspx.
Последовательность загрузки такая же.
Request Timeline
"GET /" |*|
"GET /Hang.aspx" |******************************************|
"GET /Test.aspx" |**************************************|
Я думаю, мой вопрос в том, как отключить эту функцию. Я понимаю, что полезно иметь так, что состояние сеанса может быть более предсказуемым, однако в моем случае долговременная загрузка страниц отчетов убивает способность пользователей к многозадачности.
Ответы
Ответ 1
Это поведение по дизайну; допускается одновременный доступ к состоянию сеанса. Запросы с одинаковым SessionID будут заблокированы исключительно для предотвращения возможного повреждения его состояния.
Чтобы обойти это, вы можете отключить состояние сеанса в своей директиве.
<%@ Page EnableSessionState="false" %>
Прочитайте "Параллельные запросы и состояние сеанса" здесь http://msdn.microsoft.com/en-us/library/ms178581.aspx для более.
Настройка EnableSessionState="ReadOnly"
не позволит этой странице получить эксклюзивную блокировку на SessionState (но самой странице придется ждать, пока другие запросы, отличные от ReadOnly, не будут завершены до загрузки).
(Это копия и вставка моего ответа на этот вопрос Сайт ASP.net: страница с длинной загрузкой для пользователя ставит все остальные загрузки страницы для пользователя в режиме "Удержание" . )