Mensaje de difusión a todos los clientes excepto a sí mismo en SignalR

Me doy cuenta de que estas preguntas son similares:

SignalR – Difusión a todos los clientes excepto el llamante

Enviar un mensaje a todos los clientes en un grupo, excepto el cliente actual

Sin embargo, son viejos y nada en la documentación actual me dio pistas sobre si estoy haciendo lo correcto o no.

Aquí está la pregunta / problema:

Necesito poder transmitir un mensaje desde el lado del servidor a todos los clientes conectados, excepto al tipo que envió la solicitud http: imagine que alguien envía un formulario y hace que todas las personas conectadas al mismo formulario sean notificadas de que se ha enviado algo.

La forma en que lo estoy haciendo ahora es algo como esto:

var context = GlobalHost.ConnectionManager.GetHubContext(); var connectionID = HttpContext.Request.Cookies["conn-id"].Value; context.Clients.AllExcept(connectionID).addMessage(message); 

Y cada vez que se establece una conexión, configuro ConnectionID en una cookie en el lado del cliente como tal:

 $.connection.hub.start().done(function(){ $.cookie("conn-id",$.connection.hub.id); }); 

Así que mis preguntas son:

  1. ¿Es este el mejor / único enfoque que puedo tomar en este caso? ¿Puedo leer el ID de conexión del cliente que originó la solicitud desde otro lugar como hub.Context.ConnectionID o algo similar a la forma en que obtendría el SessionID de HttpContext.Current.Session.SessionID?

  2. ¿Puedo configurar el ID de conexión mediante progtwigción cuando un cliente se conecta configurándolo con el SessionID, por ejemplo? ¿Podría eso causar un problema por alguna razón? Si es así, ¿puede explicar cómo configurar la ID de conexión mediante progtwigción y a qué evento debo conectarme para hacer esto?

Noté que cada vez que la página se vuelve a cargar, la identificación de la conexión se cambia a un guid diferente. ¿Cómo configura ConnectionId solo una vez y lo mantiene al menos durante la vida de la sesión?

Su enfoque funciona, sin embargo, el enfoque correcto es utilizar la API Clients.Others.addMessage(message) : Clients.Others.addMessage(message) . Además, no es necesario obtener el contexto del concentrador dentro del concentrador. Siempre puede acceder a la ID de conexión actual a través de Context.ConnectionId o enviar clientes de mensajes a través de Clients.All.foo ();

Y no puede configurar el ConnectinoID programáticamente. Si desea realizar un seguimiento de los usuarios en todas las páginas, mantenga una lista de usuarios en su servidor y luego vuelva a asignar los ID de conexión a medida que navegan por el sitio.

Aquí hay una publicación que explica el seguimiento de los usuarios: SignalR 1.0 beta connection factory

Si está enviando el mensaje en un método en la clase Hub, también puede usar Clients.Others para excluir al cliente que realiza la llamada. Solo necesita usar AllExcept (id) si no está en un método de hub.

Vea lo siguiente para detalles:

http://www.asp.net/signalr/overview/hubs-api/hubs-api-guide-server#selectingclients