2010-02-10 24 views
5

Estoy ejecutando un sitio web ASP.NET en mi cuadro de desarrollo (.NET 2.0 en Vista/IIS7). El método Session_Start en global.asax.cs registra cada llamada a un archivo (log4net). El método Session_End también registra cada llamada.Gran número de Session_Start con la misma ID de sesión

Estoy usando el estado de la sesión InProc, y establezco el tiempo de espera de la sesión en 5 minutos (para evitar esperar 20 minutos).

Llegué al sitio web, aguardo los 5 minutos de la unidad Veo el inicio de Session_End. Entonces I F5 el sitio web. Los navegadores aún tienen la cookie de sesión y la envían al servidor. Se llama a Session_Start y se crea una nueva sesión utilizando la misma identificación de sesión (por cierto, necesito que sea la misma identificación de sesión, porque se usa para almacenar datos en la base de datos).

Resultado: Cada vez que presiono F5 en una sesión terminada anteriormente, se llama al método Session_Start, se ejecuta la solicitud y se llama inmediatamente al método Session_End.

Cuando abro otro navegador, el método Session_Start se llama solo una vez. Luego, después de 5 minutos, Session_End cada F5 hace que se ejecute la secuencia Session_Start/request/Session_End.

web.config sección correspondiente:

<system.web> 
    <compilation debug="true" /> 
    <sessionState timeout="2" regenerateExpiredSessionId="false" /> 
</system.web> 
+0

Necesito ayuda con este mismo problema, pero en sitios en los que no metí la sesión. Completamente al azar, el sitio realizará una transacción de BD que tengo en Session_Start cientos de veces al día para un usuario con una ID de sesión. Sin advertencia, sitios aleatorios afectados y sin respuestas. –

+0

Mire [este enlace] (http://stackoverflow.com/a/11375003/779408). Hay una solución real allí. – breceivemail

Respuesta

6

regenerateExpiredSessionId El ajuste se relaciona con cookieless URLs only, no afecta el comportamiento de una cookie de sesión que será reutilizado.

El problema que está experimentando se debe a la forma en que ASP.NET 2.0/3.5 maneja las sesiones según si está en uso. En circunstancias normales, no intenta persistir en una sesión hasta la primera vez que se usa y, por lo tanto, no emite una cookie de sesión (si no existe). La primera sesión de tiempo es utilizada, se crea una sesión en el servidor y se emite una cookie de sesión.

Ahora cuando se reinicia una sesión anterior pero no se utiliza, ASP.NET se confunde un poco. Intenta abandonar la sesión no utilizada (reiniciada) de inmediato ya que no es necesaria, lo que genera una Session_End temprana. Sin embargo, no elimina la cookie de sesión preexistente y, por lo tanto, cada solicitud subsiguiente repite la secuencia, reinicia y luego finaliza la sesión hasta que se elimine la cookie o se use la sesión.

En .NET 4.0, este comportamiento ha cambiado y el evento ya no se desencadena en este caso.

Cuestiones relacionadas