2010-11-30 9 views
23

Me parece que ASP.net pone en cola todas las solicitudes que usan la misma ID de sesión. Digamos que tienes 3 páginas.Cola de solicitud de sesión de ASP.net

Default.aspx

protected void Page_Load(object sender, EventArgs e) 
{ 
    Session["asdf"] = "LOLZ"; 
} 

Golpear esta página, obviamente, crear una nueva sesión, si no existe uno.

X-AspNet-Version: 2.0.50727 
Set-Cookie: ASP.NET_SessionId=ibjphuv0aiafqi453tyze345; path=/; HttpOnly 

Luego se golpea Hang.aspx

protected void Page_Load(object sender, EventArgs e) 
{ 
    Thread.Sleep(10000); 
} 

E inmediatamente después de golpear cualquier otra página que este identificador de sesión sería pasada a, no importa si lo hace nada, vamos a llamarlo prueba .aspx.

La secuencia para cargar es así.

Request   Timeline 
"GET /"   |*| 
"GET /Hang.aspx"  |******************************************| 
"GET /Test.aspx"   |**************************************| 

Supongo que mi pregunta es cómo puedo desactivar esta función. Entiendo que es útil tenerlo para que el estado de la sesión sea más predecible, sin embargo, en mi caso, una carga larga de la página de informes está matando la capacidad de multitarea de los usuarios.

+0

¿Cómo estás probando esto? ¿Servidor de desarrollo de IIS o Cassini en Visual Studio? – Kev

+0

IIS en Windows Server 2008, 7 Professional y VS 2010 Dev Server. – Novikov

+2

Excelente pregunta, nunca antes había pensado en esto. – Kev

Respuesta

19

Este comportamiento es por diseño; no se permite el acceso simultáneo al estado de la sesión. Las solicitudes con el mismo SessionID se bloquearán exclusivamente para evitar posibles daños a su estado.

Para evitar esto, puede deshabilitar el estado de la sesión en la directiva de su página.

<%@ Page EnableSessionState="false" %> 

Leer "Solicitudes concurrentes y el estado de sesión" aquí http://msdn.microsoft.com/en-us/library/ms178581.aspx por más.

La configuración EnableSessionState="ReadOnly" impedirá que esa página obtenga un bloqueo exclusivo en el SessionState (pero la página en sí tendría que esperar a que el usuario finalice otras solicitudes que no sean de solo lectura antes de cargarlas).

(Esta es una copia y pega de mi respuesta a esta pregunta ASP.net site: Long-loading page for user puts all other page loads for user on Hold)

+1

Gracias por el enlace. Parece una decisión de diseño deficiente por parte de Microsoft, ya que el bloqueo explícito o incluso el bloqueo de elementos en la colección eliminaría esta extraña limitación. De alguna de mis lecturas parece que este diseño es un remanente de cuando los datos de la sesión residían en un objeto COM STAThread. – Novikov

+3

@Novikov: El problema es que la sesión se carga al principio y se guarda al final de cada solicitud de página. Debido a esto, es básicamente volátil y no seguro para acceder a varias páginas durante el ciclo. Imagínese si Hang.aspx cambió el valor de la sesión clave de la que dependía Test.aspx? En este caso de uso, la aplicación estaría básicamente atornillada. Esto no es COM específico, sino más bien uno de esos problemas irresolubles. – NotMe

+1

+1 - Nunca he estado leyendo hasta el último párrafo en los documentos MS. – Kev

Cuestiones relacionadas