2012-07-13 22 views
6

Questo è legato al SignalR + posting a message to a Hub via an action method, ma la mia domanda è un po 'diverso:Invia un messaggio signalr da server a tutti i clienti

Sono sulla versione 0.5.2 di signalr, con gli hub. Nelle versioni più vecchie, si sono stati incoraggiati a creare metodi sul mozzo per inviare messaggi a tutti i clienti, che è quello che ho:

public class MyHub : Hub 
{ 
    public void SendMessage(string message) 
    { 
     // Any other logic here 
     Clients.messageRecieved(message); 
    } 

    ... 
} 

Quindi, in 0.5.2, voglio inviare un messaggio a tutti i clienti (dì da qualche parte nel controller). Come posso accedere all'istanza MyHub?

L'unico modo che ho visto in oggetto è:

var hubContext = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 
hubContext.Clients.messageRecieved("hello"); 

che va bene, ma voglio chiamare il metodo sul mio hub.

+0

Questo è ora possibile anche in ASP.NET Core (sebbene SignalR stesso sia ancora in alpha all'ora corrente). Vedi [questa risposta dettagliata] (http://stackoverflow.com/a/38832879/957950) nella versione Core di questa domanda. – brichins

risposta

18

È possibile farlo utilizzando un metodo statico:

SignalR v.04-

public class MyHub : Hub 
{ 
    internal static void SendMessage(string message) 
    { 
     var connectionManager = (IConnectionManager)AspNetHost.DependencyResolver.GetService(typeof(IConnectionManager)); 
     dynamic allClients = connectionManager.GetClients<MyHub>(); 
     allClients.messageRecieved(message); 
    } 

    ... 
} 

SignalR 0.5+

public class MyHub : Hub 
{ 
    internal static void SendMessage(string message) 
    { 
     IHubContext context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 
     context.Clients.messageRecieved(message); 
    } 

    ... 
} 

È quindi possibile chiamare questo modo:

MyHub.SendMessage("The Message!"); 

Buono articolo e sulle API SignalR: http://weblogs.asp.net/davidfowler/archive/2012/05/04/api-improvements-made-in-signalr-0-5.aspx

Fornito da Paolo Moretti nei commenti

+1

'AspNetHost.DependencyResolver' è scomparso in SignalR 0.5+. Vedi [qui] (http://weblogs.asp.net/davidfowler/archive/2012/05/04/api-improvements-made-in-signalr-0-5.aspx) (Ottenere un riferimento alla connessione/hub fuori da una connessione o un hub) –

+0

@PaoloMoretti - grazie per il suggerimento! – Paul

+0

Cheers, questo è il trucco! –

4

ho avuto lo stesso problema, nel mio esempio addNotification è metodo sul lato client:

var hubContext = GlobalHost.ConnectionManager.GetHubContext<SignalR.NotificationsHub>(); 
hubContext.Clients.addNotification("Text here"); 

Su di te lato client si può aggiungere codice per chiamare il metodo di hub in addNotification:

var notification = $.connection.notificationHub; 
notification.addNotification = function (message) { 
notification.addServerNotification(message); // Server Side method 
} 

$.connection.hub.start(); 

hub:

AGGIORNAMENTO: Leggere la tua domanda più e più volte agianamente Non trovo davvero un motivo per farlo. I metodi Hub sono di solito disponibili per essere chiamati dal lato client, o ho frainteso te, comunque qui c'è un aggiornamento. Se vuoi fare una cosa lato server e poi avvisare i clienti.

[HttpPost] 
    [Authorize] 
    public ActionResult Add(Item item) 
    { 
     MyHubMethodCopy(item); 
     var hubContext = GlobalHost.ConnectionManager.GetHubContext<SignalR.NotificationsHub>(); 
    hubContext.Clients.addNotification("Items were added"); 

    } 

    private void MyHubMethodCopy(Item item) 
    { 
     itemService.AddItem(item); 
    } 
+0

L'altra risposta risponde alla mia domanda ma ottieni un +1 perché su riflessione, non sono sicuro di dover chiamare un metodo hub - come dici tu "i metodi hub sono lì per essere usati dal client" –

+0

+1 per indicare come utilizzare i metodi hub. Stavo per fare lo stesso errore. riparato dopo questo. –

+0

@emrenevayeshirazi quale errore? – sotn

Problemi correlati