2010-03-29 7 views

Respuesta

3

Debo estar en desacuerdo con Darin. Llamo a una función en Session_End para registrar el final de la sesión. No he probado esto explícitamente, pero busqué en mis registros las últimas veces que el grupo de aplicaciones se recicló. Se llamó a la función y se registró el final de las sesiones activas.

Esto ocurrió tanto cuando el grupo de aplicaciones se recicló en un horario como cuando se recicló porque implementé algunos dlls nuevos.

+0

De acuerdo, acabo de probar y disparó :-) –

1

Si recuerdo correctamente (hace un tiempo que no leo los documentos) tener sesiones activas retrasará el temporizador normal de reciclaje del grupo de aplicaciones (que se dispara cuando se liberen los recursos) porque el servidor deposita en sesiones activas lo que significa que hay necesidad continuada Una vez que las sesiones caducan (y desencadena el evento session_end), el temporizador de reciclaje de aplicaciones comienza de nuevo y realiza una cuenta regresiva, y finalmente se activa antes de que el grupo de subprocesos libere sus propios recursos y finalice la aplicación.

Eso es en circunstancias normales, debe tenerse en cuenta que el evento session_end no está garantizado para disparar (hay escenarios muy específicos donde no sería así), creo que ahora esto está relacionado principalmente con las instancias bloqueadas de IIS o App Pool se recicla para OOM o errores. Solía ​​ser, a menos que estuvieras usando solo uno de los tipos de sesión (creo que el servidor de estado) no se activará de manera confiable. Esto puede ser diferente ahora.

Si necesita garantizar que se liberen los recursos, no estoy seguro de que session_end sea el lugar adecuado para hacerlo. ¿Puedes elevarlo a la caché de la aplicación o al caché de HTTP y usar claves únicas de sesión con eventos de limpieza periódicos? Eso podría ser más confiable (más código) pero más confiable.

Mi experiencia general es que session_end se dispara bastante confiablemente, pero lo he visto fallar bajo una carga sustancial (100s de hits por segundo) y sé que cuando empiezas a hablar de granjas de servidores, se vuelve mucho más complicado también.

+0

Solo estoy hablando de 20-30 usuarios como máximo, pero el costo de dejar la conexión abierta es muy alto y no confío en que el servidor remoto lo cierre. –

1

Tenga en cuenta también que Session_End solo se invoca si utiliza el modo de sesión Inproc. Para otros modos (incluido el modo de estado de sesión SQL) este evento nunca se plantea.

Cuestiones relacionadas