Tenemos una aplicación MVC.NET que encuentra errores fatales cuando se reinicia. En nuestro controlador de eventos Session_Start, agregamos la identificación de la sesión a un diccionario. En el controlador Session_End, lo eliminamos. Considere la siguiente secuencia de solicitudes:La aplicación ASP.NET MVC dispara Session_Start varias veces para una sola sesión
GET home.mvc
< aplicación reinicia >
GET main.css
GET banner.jpg
GET somedata.mvc
...
Debido a la forma en que se diseña la aplicación, este tipo de secuencia ocurre con bastante frecuencia si realiza una reconstrucción mientras la aplicación está abierta en una ventana del navegador. Eso no sería terriblemente preocupante, excepto que también lo veo en entornos de producción. Por ejemplo, ocurrirá (aunque raramente) cuando edite web.config.
Las solicitudes que siguen al reinicio se deben a enlaces en la página de inicio o llamadas AJAX desde JavaScript.
Lo que observo es que .NET maneja las primeras 5 solicitudes en paralelo. Cada solicitud hace que desencadene el evento Session_Start. Después de un corto tiempo, dispara el evento Session_End 3 veces. Para que quede claro, cada Session_Start corresponde a la misma sesión. Todos tienen el mismo ID de sesión y la propiedad IsNewSession es verdadera para todos los objetos de estado de sesión. Además, los eventos Session_End hacen no corresponden a la sesión que se está matando. La sesión persiste, junto con los datos almacenados en el estado de la sesión.
Necesito evitar que active Session_Start más de una vez o descubrir cómo saber cuándo Session_End realmente no significa que la sesión ha finalizado.
¿Qué es lo que tiene que tratar? ¿Estás diciendo que hay una discrepancia entre tu diccionario y el diccionario interno de asp.net? ¿En qué momento encuentras la discrepancia? –
¿El diccionario está almacenado en una variable de aplicación o en una variable de sesión? –
El diccionario es una variable de aplicación. –