Tenemos un problema con un sitio web ASP.NET donde las sesiones de los usuarios se comportan de manera extraña: los datos de sesión aparecen, desaparecen y vuelven a aparecer.
Creo que sé cuál es el problema:
- Nuestra configuración es 2 x servidores web balanceados de carga + base de datos de estado de sesión única.
- El almacenamiento del estado de la sesión de ASP.NET SQL parece depender del ID de la instancia del sitio web de IIS (ID de la metabase) para identificar de forma exclusiva el ID de la cookie de la sesión entrante y recuperar / almacenar valores.
- El ID de instancia del sitio web de IIS del sitio web es diferente en cada uno de los servidores activos (ID / W3SVC / 1 / Root en el servidor web A, ID / W3SVC / 2 / Root en el servidor web B).
- El equilibrio de carga no utiliza la afinidad del cliente, por lo que cada solicitud HTTP del usuario podría ir a cualquiera de los servidores.
Por lo tanto, cuando un usuario inicia sesión en el sitio y se mueve, cada llamada HTTP puede ir a cualquier servidor web y, por lo tanto, usar un registro de estado de sesión con diferentes ID dependiendo del servidor. En efecto, el usuario tendría simultáneamente 2 instancias de sesión separadas. Creo que he verificado esto ya que en la tabla ASPStateTempSessions de la base de datos , cada ID de cookie de sesión parece corresponder a 2 registros con nombres casi idénticos (sus ID solo difieren en los últimos caracteres, que creo que son un modificador basado en el AppID del AspStateTempApplications ( tabla) creados en segundos el uno del otro.
Por lo tanto, el estado de sesión parecerá comportarse mal ya que los cambios realizados en un registro de sesión solo persistirán en ese servidor web. Si el usuario se traslada al otro servidor con equilibrio de carga, los valores de la sesión parecerán desaparecer o revertirse.
Creo que la solución es sincronizar los ID de instancia de IIS de los sitios (por ejemplo, hacer que ambos / W3SVC / 1 / Root ), pero intenté editar ese valor en IIS en Configuración avanzada, y aunque se guardó bien, solo hizo El sitio devuelve 404s en ese servidor hasta que lo cambie de nuevo.
Me encontré un script VBS para este problema, pero parece ser para IIS 6 sólo por lo que me preocupa de intentarlo. ¿Alguien más ha encontrado esta situación en IIS 7.5 y cómo la solucionó?
EDITAR / SOLUCIÓN
Mi error fue que olvidé reiniciar IIS después de cambiar la ID de instancia del sitio en IIS. Después de esto, la ID se actualizó y las sesiones ASP.NET se sincronizaron en los dos servidores web.
Instrucciones completas:
- Escritorio remoto en el servidor LIVE1, abra IIS Mgr, haga clic en el sitio problemático y elija Configuración avanzada en la barra lateral.
- Cambie la ID a algo único, por ejemplo, 10. Haga clic en Aceptar.
- Reiniciar el servicio web (
c:\windows\system32\iisreset /restart
)
Haga lo mismo para LIVE2 (asegúrese de que la ID del sitio sea la misma que en LIVE1)
Tenga en cuenta que la ID del sitio afecta la ubicación de los archivos del sitio, por ejemplo, la carpeta del archivo de registro sería, C:\inetpub\logs\LogFiles\W3SVC10
por ejemplo.
Tenga en cuenta también que usted podría hacer estos cambios manualmente editando el sitio Identificación del atributo en el archivo de configuración de IIS en cada servidor: C:\Windows\System32\inetsrv\config\applicationHost.config
. Requiere administrador privs y aún necesita un reinicio después.