2013-06-21 15 views
15

Mi rendo conto che queste domande sono simili:Broadcasting messaggio a tutti i client, ad eccezione di sé in SignalR

SignalR - Broadcast to all clients except Caller

Send a message to all clients in a Group, except for the current client

Tuttavia, essi sono vecchi e nulla nella documentazione corrente mi ha dato alcun indizio come se sto facendo la cosa giusta o no.

ecco la domanda/problema:

ho bisogno di essere in grado di trasmettere un messaggio dal lato server per tutti i client connessi, tranne il ragazzo che ha presentato la richiesta HTTP - immaginare che qualcuno inviando un modulo e ottenere tutte le persone collegato allo stesso modulo notificato che qualcosa è stato inviato.

Il modo in cui sto facendo che ormai è qualcosa di simile:

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 
var connectionID = HttpContext.Request.Cookies["conn-id"].Value; 
context.Clients.AllExcept(connectionID).addMessage(message); 

E ogni volta che viene stabilita una connessione, ho impostato ConnectionID in un cookie sul lato client, come così:

$.connection.hub.start().done(function(){ 
     $.cookie("conn-id",$.connection.hub.id); 
}); 

Quindi le mie domande sono:

  1. È questo il miglior unico approccio/posso prendere in questo caso? Posso leggere l'id di connessione del client che ha originato la richiesta da qualche altra parte come hub.Context.ConnectionID o qualcosa di simile al modo in cui si otterrebbe il SessionID da HttpContext.Current.Session.SessionID?

  2. Posso impostare l'ID di connessione a livello di programmazione quando un client si connette impostandolo su SessionID, ad esempio? Potrebbe causare un problema per qualche motivo? In tal caso, puoi spiegare come impostare l'ID di connessione a livello di codice e a quale evento devo collegarmi per farlo?

Ho notato che ogni volta che la pagina viene ricaricata, l'ID di connessione viene cambiato in un guid diverso. Come si imposta ConnectionId solo una volta e lo si mantiene almeno per la durata della sessione?

risposta

20

Il tuo approccio funziona, ma l'approccio corretto è quello di utilizzare il costruito nel API: Clients.Others.addMessage(message). Inoltre non è necessario ottenere il contesto dell'hub all'interno dell'hub stesso. È sempre possibile accedere all'ID di connessione corrente tramite Context.ConnectionId o inviare i messaggi sto client tramite Clients.All.foo();

E non è possibile impostare il ConnectinoID in modo programmatico. Se desideri monitorare gli utenti su più pagine, mantieni un elenco di utenti sul tuo server e quindi riassegna gli ID di connessione mentre navigano nel sito.

Ecco un post che spiega il tracciamento degli utenti: SignalR 1.0 beta connection factory

Problemi correlati