2009-03-07 15 views
10

Estoy trabajando en la aplicación de chat, utilicé HashTable para contener el usuario y el operador como una clave & Objeto de la clase ChatRoom como un valor de HashTable. El problema principal es que cuando el usuario o el operador cierran el navegador o se desconectan sin cerrar la sesión, se desconecta automáticamente al final de la sesión.¿Cómo se maneja el fin de sesión en global.asax?

Por favor ayúdenme relacionado con eso y cómo usar Global.asax en este asunto.

Respuesta

14

Agregue un archivo Global.asax a su sitio web y, en el evento Session_End, elimine al usuario de su HashTable.

protected void Session_End(Object sender, EventArgs e) 
{ 
    // Remove user from HashTable 
} 
+0

En mi tabla hash contiene clave, que también es Session ["UserID"] contiene, Esta sesión se usa para pasar el parámetro usrid de Logout (string usrid), en Session_End event, Si tiene alguna idea, por favor ayúdenme ... –

+2

No entiendo tu pregunta. Lo siento. – MartinHN

24

Usted puede utilizar el evento final de la sesión de global.asax para eliminar el usuario desconecta de forma inesperada:

void Session_End(Object sender, EventArgs E) { 
    // Clean up session resources 
} 

pero ojo, la sesión no termina cuando el usuario cierra su navegador o su conexión perdida. Finaliza cuando llega el tiempo de espera de la sesión.

+0

Si realizo cambios en mi archivo Web.config para Session TimeOut, ¿funciona? –

+0

no, puede reducir el tiempo de espera de su sesión, pero afecta a toda la aplicación de forma inesperada. Tal vez pueda establecer un control programático en su aplicación de chat. por ejemplo, si un usuario no realiza ninguna acción durante 5 minutos, puede asumir que está desconectado. – Canavar

+2

El comentario de @ ashishbhatt es correcto para mí. Puede reducir mucho el tiempo de espera de la sesión (es decir, 1 minuto) pero ** luego debe asegurarse ** de que al menos una llamada AJAX sin operación se realice de forma continua como un latido (o mantener vivo). Esto es solo un truco, y se supone que no se debe escalar a millones de usuarios –

6

El evento Session_End no se activa cuando el navegador está cerrado, se dispara cuando el servidor no ha recibido una solicitud del usuario en un período de tiempo específico (por defecto 20 minutos). Esto significa que si usa Session_End para eliminar usuarios, permanecerán en el chat durante 20 minutos después de que hayan cerrado el navegador.

Le sugiero que guarde la hora de la última solicitud en el objeto de usuario. De esta forma, puede determinar qué tan activo es el usuario y qué posibilidades hay de que el usuario abandone el chat. Por ejemplo, puede mostrar a un usuario que no ha hecho nada durante dos minutos como inactivo.

También puede dejar que la aplicación de chat consulte periódicamente el servidor (si no lo hace ya). Esto actualizaría la última hora de solicitud en el objeto y mantendría al usuario vivo mientras la ventana de chat esté abierta.

Puede utilizar el evento onunload en el navegador para enviar una solicitud de cierre de sesión al servidor cuando el usuario abandone la página. Esto, por supuesto, solo funciona si el usuario todavía tiene conectividad de red. El evento onunload también se activa cuando recargas la página, por lo que tendrías que hacer un seguimiento de por qué se desencadena el evento para usarlo.

+1

gracias Guffa, si usé el evento onunload entonces llamará Leave() pero en ese problema principal es cuando renueve el botón y luego se llama Leave() , Manejo F5, AlterF4, hago clic derecho en el cuerpo, pero ¿cómo se puede hacer clic en el botón Actualizar en todos los navegadores? Si tienes alguna idea, por favor, ayúdame. –

1

Puede JavaScript que siempre se ejecuta en el cliente y envía una señal al servidor como "Estoy aquí". Si la próxima señal no llega, puede llamar al Leave();. Usé con AJAX para hacer esto.

Cuestiones relacionadas