Pregunta

Estoy ejecutando un sitio web de 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.

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

Llego al sitio web, espero por una unidad de 5 minutos, veo el registro de session_end. Luego f5 el sitio web. Los navegadores todavía 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 ID de sesión (por cierto: Necesito que sea la misma ID de sesión, porque se usa para almacenar datos en la base de datos).

Resultado: cada vez que presiono F5 en una sesión previamente finalizada, se llama el método Session_Start, se ejecuta la solicitud y el método Session_end se llama de inmediato.

Cuando abro un navegador diferente, el método Session_Start se llama solo una vez. Luego, después de 5 minutos, la sesión_end cada F5 hace que la secuencia session_start/request/session_end ejecute.

Sección relevante de Web.Config:

<system.web>
  <compilation debug="true" />
  <sessionState timeout="2" regenerateExpiredSessionId="false" />
</system.web>
¿Fue útil?

Solución

los regenerateExpiredSessionId la configuración se relaciona con URLS de Cookiels solo, no afecta el comportamiento de una cookie de sesión que se reutilizará.

El problema que está experimentando se debe a la forma en que ASP.NET 2.0/3.5 maneja las sesiones en función de si está en uso. En circunstancias normales, no intenta persistir 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 es Usada, se crea una sesión en el servidor y una cookie de sesión emitida.

Ahora, cuando se reinicia una sesión anterior pero no se usa, ASP.NET se confunde un poco. Intenta abandonar la sesión no utilizada (reiniciada) inmediatamente, ya que no es necesario, lo que plantea una sesión temprana_end. Sin embargo, no elimina la cookie de sesión preexistente y, por lo tanto, cada solicitud posterior repite la secuencia, reiniciando y luego terminando la sesión hasta que se elimine la cookie o se usa la sesión.

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

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top