Очередь запросов сеанса 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"            |**************************************|

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


person Novikov    schedule 30.11.2010    source источник
comment
Как вы это тестируете? Сервер разработки IIS или Cassini в Visual Studio?   -  person Kev    schedule 01.12.2010
comment
IIS на Windows Server 2008, 7 Professional и VS 2010 Dev Server.   -  person Novikov    schedule 01.12.2010
comment
Отличный вопрос, я никогда не думал об этом раньше.   -  person Kev    schedule 02.12.2010


Ответы (1)


Такое поведение предусмотрено дизайном; не допускается одновременный доступ к состоянию сеанса. Запросы с одним и тем же SessionID будут заблокированы исключительно для предотвращения возможного повреждения его состояния.

Чтобы обойти это, вы можете отключить состояние сеанса в своей директиве страницы.

<%@ Page EnableSessionState="false" %>

Прочтите раздел «Параллельные запросы и состояние сеанса» здесь http://msdn.microsoft.com/en-us/library/ms178581.aspx, чтобы узнать больше.

Установка EnableSessionState="ReadOnly" предотвратит получение этой страницей монопольной блокировки в SessionState (но сама страница должна будет дождаться завершения других запросов пользователя, не предназначенных только для чтения, перед загрузкой).

(Это копия и вставка моего ответа на этот вопрос Сайт ASP.net: страница с длительной загрузкой для пользователя переводит все другие загрузки страниц для пользователя в режим ожидания)

person danielfishr    schedule 30.11.2010
comment
Спасибо за ссылку. Похоже, это неудачное дизайнерское решение со стороны Microsoft, поскольку явная блокировка или даже блокировка элементов в коллекции устранит это странное ограничение. Из моего чтения кажется, что этот дизайн является пережитком того времени, когда данные сеанса находились в COM-объекте STAThread. - person Novikov; 01.12.2010
comment
@Novikov: Проблема в том, что сеанс загружается в начале и сохраняется в конце каждого запроса страницы. Из-за этого он в основном изменчив и небезопасен для доступа к нескольким страницам в течение цикла. Представьте, если Hang.aspx изменил ключевое значение сеанса, от которого зависел Test.aspx? В этом случае приложение будет в основном облажаться. Это не специфично для COM, а скорее одна из тех неразрешимых проблем. - person NotMe; 01.12.2010
comment
+1 - я так и не удосужился прочитать последний абзац в документах MS. - person Kev; 02.12.2010
comment
@kev, они обязательно должны были поместить это в первый абзац! мне потребовалась лучшая часть 10 лет, чтобы узнать об этой функции. никогда даже не замечал этого, пока в Fiddler не случаются эти странные вещи (ошибки), которые заставляют вас копать глубже - person Simon_Weaver; 21.06.2013
comment
Есть ли способ использовать что-то похожее на EnableSessionState в службе WCF, размещенной за точкой доступа? - person Alex; 29.12.2020