tutorial specific net example asp c# javascript asp.net-mvc signalr signalr-hub

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:

  1. 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 .