Error ASP clásico en Global.asa: Objeto requerido: 'Sesión'
-
24-10-2019 - |
Pregunta
Código ASP del lado del lado del servidor en una máquina Windows 2003, ASP.NET 2.0* instalado. Estamos teniendo un problema extraño en la que la primera vez que un usuario se conecta al sitio web, el session_onStart en los disparos globales.ASA, pero el objeto de sesión es nulo. Algo simple como:
Session.Timeout = 30
Causa el siguiente error: Objeto requerido: 'Sesión'
El sitio web ha sido 'creado' en la pestaña del directorio de inicio de IIS Manager, y las sesiones están habilitadas en la página de configuración para el sitio.
En la mayoría de los casos, el objeto de sesión existe si el usuario actualiza la página. Pero esa primera visita para un usuario único siempre causa el error.
¿Sugerencias? El código no tiene un error, ya que funcionó en el antiguo sistema Win2000.
Solo para reiterar: Windows 2003 Server, que ejecuta IIS6, con .NET 2.0 instalado. El sitio web se está ejecutando como una aplicación, no como un directorio virtual.
Solución
Descubrí el problema. Se debía a tener más de un trabajador en el grupo de aplicaciones utilizado para el sitio web. Dado que no había garantía de qué proceso de trabajo manejaría la solicitud de un cliente, y cada proceso de trabajador crearía su propia instancia de la sesión del cliente, la sesión se eliminaría y se recreará cuando IIS decidiera que un proceso de trabajador diferente debería manejar una solicitud. El problema se resolvió utilizando solo un proceso de trabajadores en el grupo de aplicaciones y sacando todos los demás sitios web del grupo de aplicaciones y en el suyo.
Ahora estoy buscando una manera de tener varios trabajadores en el grupo de aplicaciones, pero que el cliente se adhiera al proceso de trabajadores. Pero ese es un problema diferente que investigaré.
Otros consejos
Un problema bastante interesante.
Sabemos que cuando la sesión se abandona explícitamente o eventualmente se desprende, se destruye rápidamente. Agregaría código como el siguiente, para garantizar que no puede suceder.
If Session("test") Is Nothing Then
Response.Redirect("Whatever.asp")
End If
También puede llamar al código que crea sus objetos en este bloque; De esta manera, si detectas que la sesión fue destruida de alguna manera, podrías recrearlos.