Se devuelven datos de sesión ASP.NET incorrectos de forma intermitente

Se devuelven datos de sesión ASP.NET incorrectos de forma intermitente

Me han encomendado la tarea de investigar un problema en el que la sesión de un usuario cambia entre actualizaciones de una página. Inmediatamente (sin saber nada sobre el sitio web) dije que parece un problema de configuración de clúster web/equilibrio de carga. Sin embargo, descubrí más tarde que el sitio web no tiene equilibrio de carga: es un único servidor.

La aplicación tiene un objeto Cesta que se almacena en la Sesión. El usuario agrega artículos a la cesta, etc. Cuando está en la página de la cesta, si la página se actualiza, los artículos que están en la cesta cambian y, a veces, no hay ninguno.

La sesión no se pierde, casi siempre vuelve en la siguiente actualización, pero luego la cesta puede estar vacía o tener un contenido diferente en la siguiente actualización. He visto este comportamiento muchas veces antes, pero sólo en configuraciones de múltiples servidores.

Esto es algo que hemos intentado replicar en un entorno de desarrollador sin éxito; simplemente no podemos replicar el problema, pero en vivo sucede con frecuencia.

La aplicación web es un sitio ASP.NET WebForms que se ejecuta en .NET 4.0 en Windows Server 2008 R2 e IIS 7.5.

El modo de estado de la sesión es InProc y el tiempo de espera de la sesión está establecido en 480 minutos.

He usado Fiddler para ver las solicitudes y respuestas y el ID de sesión de ASP.NET pasado al servidor es el mismo cada vez. Parece no haber ninguna diferencia entre las respuestas además del HTML real devuelto.

¿Alguien tiene alguna idea sobre lo que podría causar este problema?

Actualización 1:

He reelaborado algunos de los registros que un colega implementó en el código de la cesta. Ahora puedo ver que el ID de sesión sigue siendo el mismo y el valor de la variable de sesión también permanece igual aunque se muestren datos diferentes.

Lo siento, debería haber revisado su registro antes de publicar esto.

Estoy convencido de que se trata de un problema del servidor; el código funciona como se esperaba en nuestro entorno de prueba.

Respuesta1

"Dije que parece un problema de equilibrio de carga/configuración del clúster web. Sin embargo, más tarde descubrí que el sitio web no tiene equilibrio de carga: es un solo servidor".

El hecho de que sea un servidor único no significa que no haya equilibrio de carga. IIS tiene dentro una característica llamada "Web Garden" que divide el trabajo web en más de un proceso, de modo que pueda distribuirse en múltiples CPU.

Es como una pequeña "granja web", de ahí el nombre "jardín web". :)

Un efecto al utilizar Web Garden es que hace que las variables de sesión de InProc dejen de funcionar correctamente, ya que puede terminar en un proceso de trabajo diferente en cada solicitud de página. InProc (En proceso) sólo funciona de manera confiable si siempre terminasen el mismo proceso.

Solución 1:

  • Asegúrese de que IIS no esté configurado para utilizar Web Garden. Para hacer esto:
    1. Abra el administrador de IIS.
    2. Determine qué grupo de aplicaciones está utilizando su aplicación web.
    3. Haga clic derecho en su grupo de aplicaciones y seleccione "Propiedades avanzadas".
    4. Desplácese hacia abajo y configure "Procesos máximos de trabajo" a 1.

Configuración del grupo de aplicaciones

Solución 2:

Consulte este blog de MSDN:Gestión del estado de sesión en proceso

Describe las opciones de estado de su sesión y cómo solucionar problemas de pérdida de sesión de InProc.

Respuesta2

No he cambiado el código durante mucho tiempo (último cambio: 20 de julio de 2016).

Pero también tengo el mismo problema en Windows Server 2016. Mi cliente actualizó Windows 2012 R2 a Windows 2016. No pude resolver este problema.

Luego bajé al servidor anterior (Windows 2012 R2). Mi problema fue resuelto. Creo que es un error pero no puedo estar seguro.

Quizás te ayude.

información relacionada