2012-09-15 23 views
12

¿Hay una buena manera de llamar a los métodos en SignalR hub desde un controlador?Obtención del concentrador actual en SignalR

Ahora mismo tengo unas pocas cosas:

public class StatsHub : Hub 
{ 
    private static readonly Lazy<StatsHub> instance = new Lazy<StatsHub>(() => new StatsHub()); 
    public static StatsHub Instance { get { return instance.Value; } } 

    public StatsHub() 
    { 
     if (this.Clients == null) 
     { 
      var hubContext = SignalR.GlobalHost.ConnectionManager.GetHubContext<StatsHub>(); 
      this.Clients = hubContext.Clients; 
      this.Groups = hubContext.Groups; 
     } 
    } 

    // methods here... 
} 

por lo que en mis acciones del controlador que se acaba de decir, por ejemplo

StatsHub.Instance.SendMessage("blah"); 

y es casi bueno, excepto que hubContext no tiene llamadas o Propiedades de contexto de Hub - que son agradables de tener.

Con suerte, ¿hay una mejor manera de hacer esto?

Respuesta

14

Encontré un DefaultHubManager, que es lo que necesito, creo.

DefaultHubManager hd = new DefaultHubManager(GlobalHost.DependencyResolver); 
var hub = hd.ResolveHub("AdminHub") as AdminHub; 
hub.SendMessage("woohoo"); 

Trabajos. Si hay una forma mejor/preferida, por favor comparte.

+5

Esto no funciona más (en SignalR 2?). Ver http://stackoverflow.com/questions/17896739/use-hub-methods-from-controller. –

+0

'DefaultHubManager' existe en SignalR 2.x sin embargo' hub.Context' es nulo, por lo que todas las operaciones fallan. – Dai

+0

esto funciona en signalR 2.0 pero obtengo una excepción No se admite el uso de una instancia de Hub no creada por HubPipeline – GreyCloud

18

Si desea transmitir a través de un concentrador desde fuera del concentrador, necesita GlobalHost.ConnectionManager.GetHubContext<MyHub>() para obtener el contexto del concentrador. A continuación, puede usar este contexto para transmitir a través de la propiedad .Clients.

Como se indica en el código de muestra, ya se conoce el contexto del concentrador, pero hacerlo dentro del centro no me parece correcto en mi opinión. Si solo está utilizando la lógica en SendMessage() desde las acciones de su controlador, movería el código directamente a la acción del controlador y usaría el contexto del hub obtenido a través del GetHubContext<T>() desde allí.

Tenga en cuenta que la propiedad Caller o Context siempre será null en este escenario, porque SignalR no estaba involucrado al hacer una solicitud al servidor y por lo tanto no puede proporcionar las propiedades.

Cuestiones relacionadas