2012-09-15 2 views
12

C'è un buon modo per chiamare i metodi nell'hub SignalR da un controller?Ottenere l'hub corrente in SignalR

In questo momento ho questo:

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

così nelle mie azioni di controller posso solo dire, per esempio

StatsHub.Instance.SendMessage("blah"); 

ed è quasi buono, tranne che hubContext non ha chiamante o Proprietà del contesto di Hub - che sono belle da avere.

Speriamo, c'è un modo migliore per farlo?

risposta

14

Trovato un DefaultHubManager, che è quello che mi serve, penso.

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

Opere. Se c'è un modo ancora migliore/preferito - per favore condividi.

+5

Questo non funziona più (in SignalR 2?). Vedi http://stackoverflow.com/questions/17896739/use-hub-methods-from-controller. –

+0

'DefaultHubManager' esiste in SignalR 2.x tuttavia' hub.Context' è nullo, quindi tutte le operazioni falliscono. – Dai

+0

funziona in signalR 2.0 ma ottengo un'eccezione L'uso di un'istanza Hub non creata da HubPipeline non è supportato – GreyCloud

18

Se si desidera trasmettere su un hub dall'esterno dell'hub, è necessario GlobalHost.ConnectionManager.GetHubContext<MyHub>() per ottenere il contesto dell'hub. È quindi possibile utilizzare questo contesto per trasmettere tramite la proprietà .Clients.

Come indicato nel codice di esempio, si ottiene già il contesto hub, ma farlo all'interno dell'hub non è corretto a mio parere. Se utilizzi la logica solo in SendMessage() dalle azioni del controller, spostarei il codice direttamente nell'azione del controller e utilizzerò il contesto hub ottenuto tramite GetHubContext<T>() da lì.

Si prega di notare che la proprietà Caller o Context sarà sempre null in questo scenario, perché SignalR non è stato coinvolto quando si effettua una richiesta al server e quindi non in grado di fornire le proprietà.