2012-05-18 22 views
7

Estoy buscando en SignalR para un proyecto en el que estoy trabajando, y parece ser EXACTAMENTE lo que quiero. Sin embargo, un poco que todavía estoy un poco desconcertado por los grupos y unirse.SignalR y unirse a grupos

Primero intentaré describir el contexto de la implementación. Por lo tanto, un usuario dentro de un sistema existente querrá mantener una reunión sobre un tema determinado y luego creará una habitación con un nombre/identificador dado, luego invitará a otros a ella y, básicamente, será como una sala de chat privada.

Así que los pasos que supongo serían como el host, crear una sala y unirme, y luego enviar invitaciones que requerirían que los usuarios hagan clic, lo que de alguna manera le diría al servidor a qué sala unirse.

Ahora veo en la documentación que hay un método de unión y desconexión que puede enganchar para poner a alguien en un grupo, sin embargo parece que la unión no tiene ningún contexto asociado a la cadena de consulta, entonces Estoy un poco confundido en cuanto a lo que desencadena una unión, como era de esperar, sería un método desencadenado manualmente en el cliente pasando por algún objeto dando contexto en cuanto a qué sala ponerlos, ya que podría tener cientos de salas privadas.

Entonces, ¿cómo le da al método Join algo de contexto, y desconecta uno, para que sepan a qué sala está solicitando unirse, como si no se activara manualmente cómo puede establecer la cadena de consulta, y si es activada manualmente por qué no puede enviar un objeto personalizado. es decir

public Task Join() 
{ 
    var groupName = Context.QueryString["some-room-identifier"]; 
    return Groups.Add(Context.ConnectionId, groupName); 
} 

vs

public Task Join(string groupName) 
{ 
    return Groups.Add(Context.ConnectionId, groupName); 
} 

Así que me estoy perdiendo algo o hay alguna manera de dar contexto a un usuario de unirse a ponerlos en el lugar correcto primera vez?

Respuesta

8

He tenido más o menos la misma experiencia que tú y he trabajado y luchado para lograrlo, así que compartiré lo que hice.

Tendrá que capturar un estado en alguna parte. Consulte la wiki de SignalR Hubs https://github.com/SignalR/SignalR/wiki/Hubs en Roundtripping from Client to Server. Lo encontré útil ya que le dice cómo establecer el estado en el concentrador o cliente del servidor y recuperarlo en el otro extremo.

Llegué a la misma conclusión que usted, que la unión se desencadena manualmente por algún evento. Estoy usando una encuesta para ver si alguien ha solicitado una conversación con el usuario. En realidad se puede empujar desde el servidor (ver SignalR Join Group From Controller), lo que significa que la acción del controlador que maneja la adición de un nuevo mensaje de chat puede llamar Join método del concentrador:

// join chatroom 
public Task Join(dynamic mygroup) 
{ 
var groupName = groupy.GetGroupName(parent.userId, (int)mygroup.userIdTo); 
return Groups.Add(Context.ConnectionId, groupName); 
} 

Para mis nombres de grupos, utilizo un Singleton para generar y haga un seguimiento de los nombres usando un Dictionary<string, int[]> (el int[] es para usuarios).

Para el estado del cliente, terminé creando un objeto JavaScript personalizado que administraba el nombre del grupo, así ...

Chat.Chatgroup = function (groupId, userIdTo) { 
this.GroupId = groupId; // our group's title/id 
this.UserIdTo = userIdTo; // who the other user is 
} 

Entonces llama al método signalR después de conectar

onechat.getOurGroup(mygroup) // invoke method on server 
.done(function (response) { 
mygroup = response; 
/* + whatever else you need to do*/ }); 

Ahora puede establecer un estado en el servidor y mantener ese estado en el cliente:

public dynamic GetOurGroup(dynamic mygroup) 
{ 
var ourId = groupy.GetGroupName(parent.userId, (int)mygroup.UserIdTo); 
mygroup.GroupId = ourId;      
return mygroup; 
} 

espero que sea al menos ¡vagamente útil!

+0

Gracias a todas las cosas útiles, no lo pondré como la respuesta por el momento, pero le daré una votación por la utilidad. Esperando que más personas repiquen con el tiempo. – Grofit

+0

Sí, es algo nuevo, ya que sabemos que vamos a refinar – testpattern

+0

+1. Creo que este es el único camino a seguir dado que SignalR no proporciona una API que devuelva un nombre de grupo dado un ID de conexión. – GETah