c# - specific - Llamar a clientes de hub de SignalR desde cualquier lugar del sistema
signalr send message to specific user (4)
Configuré un concentrador SignalR para comunicarme entre el servidor y el cliente. El código del lado del servidor concentrador se almacena en una clase llamada Hooking.cs. Lo que quiero es poder llamar a un método definido en Hooking.cs para que pueda transmitir mensajes a cualquier cliente conectado desde cualquier lugar de mi aplicación. Parece que se crea una nueva instancia de Hooking.cs para cada llamada de cliente / servidor, así que esperaba poder usar algo como
var hooking = new Hooking();
hooking.Test();
con el método Test () definido en Hooking.cs como
public static void Test() {
Clients.test()
}
y con un lado del cliente javascript
var hooking = $.connection.hooking;
hooking.test = function() { alert("test worked"); };
$.connection.hub.start()
Lamentablemente, no es tan simple, ya que los clientes no son estáticos, por lo que no se puede acceder desde un método estático.
Al revisar el código fuente de SignalR encontré un método que parecía prometedor, Hubs.Invoke(string hubName, string method, params object[] args)
, así que espero poder usar algo como Hubs.Invoke("Hooking", "Test")
pero no puedo hacer que funcione.
Cualquier ayuda con esto sería muy apreciada
Eche un vistazo a cómo se hace en Chat.cs
en SignalR.Samples.Hubs.Chat
desde https://github.com/SignalR/SignalR .
Puedo ver que el Dictionary<TKey, TValue>
estático Dictionary<TKey, TValue>
está siendo instanciado en la parte superior, así que imagino que también se mantienen persistentemente, ya sea con la clase Chat
como una instancia persistente (?) O esa matriz se está actualizando de alguna manera .
Compruébalo, David Fowler probablemente sea el mejor en esto.
Esta es la forma correcta de SignalR 2.x:
var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>();
context.Clients.All.addMessage(message);
Básicamente, puede usar la resolución de dependencias para el host actual para resolver la interfaz IConnectionManager
que le permite obtener el objeto de contexto para un concentrador.
Se puede encontrar más información en la documentación oficial .
Hub.GetClients ha desaparecido en la versión 0.4.0.
Desde la wiki ahora puedes usar:
IConnectionManager connectionManager = AspNetHost.DependencyResolver.Resolve<IConnectionManager>();
dynamic clients = connectionManager.GetClients<MyHub>();
Puede usar fácilmente un hub siguiendo estos 2 pasos:
Instanciando por inyección de dependencia de esta manera-
public class ClassName { ........ ........ private IHubContext _hub; public BulletinSenderController(IConnectionManager connectionManager) { _hub = connectionManager.GetHubContext<McpHub>(); ........ ........ } ............ ............ }
2.Utilizando el objeto hub
como este-
_hub.Clients.All.onBulletinSent(bulletinToSend);
Más se puede encontrar here .
El código de ejemplo se puede encontrar en este git repo .