SignalR: cómo dejar de crear una nueva conexión en la recarga de la página

Hola, estoy desarrollando una aplicación de chat junto con algunas otras páginas en mi aplicación. una vez que inicio sesión, mantengo la sesión del usuario. Mi intención principal es que el usuario reciba una notificación cada vez que otro usuario se conecte al servidor.

El problema al que me enfrento es que cada vez que navego a otra página en mi aplicación, se pierde la conexión. Cómo detener este comportamiento y continuar la conexión hasta que el usuario cierre la sesión.

Estoy usando SignalR 2.0 en el proyecto ASP.NET MVC4, ¿alguna ayuda?

preguntado el 27 de noviembre de 13 a las 04:11

debe mantener el estado del usuario en la base de datos o en otro lugar. y debe notificar a otros usuarios cada vez que el usuario cierra la sesión y no cuando la señal cierra la conexión -

signalR cierra la conexión en cada recarga de la página, ¿cómo detener este comportamiento? @Patel-

lo que es perfecto es subjetivo según el requisito @Patel, desde mi punto de vista de requisitos es extraño. -

1 Respuestas

Cada conexión solo tiene un ciclo de vida durante el tiempo que el usuario pasa en una página determinada. Cuando navegan a otra página, se establece una nueva conexión. Además, si un usuario tiene más de una pestaña o ventana del navegador abierta, tendrá varias identificaciones de conexión. No creo que desee intentar conservar la identificación de la conexión más allá de su ciclo de vida previsto.

En un escenario similar en el que trabajo, almacenamos los ID de conexión OnConnect y los eliminamos OnDisconnect. Cuando es necesario enviar un mensaje a un usuario determinado, lo enviamos a todos sus identificadores de conexión. Esto asegura que el mensaje se enviará a todas las pestañas/ventanas.

EDIT 1 lo siguiente es en respuesta a los comentarios de @Saurabh:

Considere cuál es el alcance del Hub y el de sus otras clases y el cliente. El Hub está ahí para facilitar las comunicaciones entre el navegador y el servidor. Si bien es posible hacer mucho trabajo dentro del hub, creo que es mejor trasladar la mayor parte del alcance fuera de las comunicaciones a otros lugares.

El cliente sabe que acaba de recargar una página, por lo que es un buen candidato para tomar la decisión de que se trata de un evento de reconexión.

_chatHub.server.reJoinRooms();

Luego, el concentrador puede consultar las salas del usuario, por ID de usuario, en lugar de por ID de conexión.

public Task ReJoinRooms()
{
// get the user's rooms from your repository
// optionally get the user's connectionIds from your repository
// Clients.Caller.onJoinRooms(rooms);
// or Clients.Clients(_connectionIds).onJoinRooms(rooms);
}

Entonces el cliente puede decidir si tomar acción o no:

$chatModule.client.onJoinRooms = function (rooms) {
   for (var i in rooms) {
           var _room = rooms[i];
           // if I'm not already in this room, add it to my rooms
           console.log('joining room', _room)
       }
}

Podrías desollar esto de muchas maneras diferentes. El cliente también podría poseer el alcance de las salas de memoria, en lugar de un repositorio del lado del servidor.

EDIT 2

Si la cantidad de grupos/salas a las que pertenece un usuario es cada vez mayor, es posible que el ejemplo anterior no se amplíe muy bien.

En ese caso, cada usuario podría unirse a fuentes personales en su lugar (es decir, unirse a una fuente con el nombre del GUID del usuario). Mantendríamos un registro de cada usuario que está afiliado a un grupo. Cuando se envía un mensaje a ese grupo, iteramos sobre los de esos usuarios y publicamos un mensaje en cada feed.

Respondido 16 Jul 14, 22:07

Estuve de acuerdo, también estoy siguiendo la misma estrategia en este momento, pero el problema es que estoy mostrando los usuarios que están conectados al servidor, por lo que cuando el usuario navega a otra página, ya no se muestra en línea. quiero que la conexión sea persistente siempre que esté usando la aplicación, no la página. @andes - Saurabh Sashank

Ah, cierto. Puede conservar el estado del usuario durante su sesión, en lugar de que el estado sea una función de su ID de conexión. También para las transiciones, como volver a unirse a una habitación, puede incluir un parámetro bool para indicar que el usuario se está "volviendo a conectar", en cuyo caso puede tragar los mensajes normales que se enviarían para tal evento. - Andes

Cómo identificar al mismo usuario se está reconectando ya que la identificación de la conexión es GUID, ¿puede proporcionar algún fragmento de código para ello? Sera de ayuda @andes - Saurabh Sashank

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.