2011-10-24 14 views
55

Desidero chiamare client specifico dal server e non trasmetterlo a tutti. Il problema è che sono nell'ambito di alcune richieste AJAX (in .aspx codebehind let say), e non in Hub o PersistentConnection, quindi non ho la proprietà Client - e il client che ha fatto quella chiamata ajax (jquery) non è il client Voglio inviare un messaggio signalr!Chiama client specifico da SignalR

Ora, ho un hub che viene chiamato su caricamento pagina JS, che registra un nuovo client nell'elenco server statico, quindi ho Guids client. Ma non so come usarlo per inviare messaggi dal server a client specifici.

risposta

44
+0

Grazie! Era troppo facile :) clientId è Context.ClientId in Hub? ClientID cambia in ogni richiesta del cliente, Ayende ne ha menzionato qualcosa nella sua recensione SR, o posso contare su questo come costante per ogni cliente? –

+3

"Client = connessione", quindi ogni richiesta ti darà un nuovo ID cliente. Nella prossima versione di SignalR lasceremo il tuo override della logica che genera l'id del client in modo che tu possa associarlo a qualcosa di più rilevante. Al momento, dovresti associare un id cliente a qualcosa di rilevante per la tua applicazione (come il nome utente). – davidfowl

+0

Quindi ogni volta che viene visualizzata una pagina (quando avvio l'hub), devo aggiornare il mio elenco di utenti con un nuovo clientId? –

16
$('#sendmessage').click(function() { 
    // Call the Send method on the hub. 
    chat.server.send($('#displayname').val(), $('#message').val(), $.connection.hub.id); 
    // Clear text box and reset focus for next comment. 
    $('#message').val('').focus(); 
}); 

a lato server di inviare l'id del cliente e risposta a tale id

public void Send (string name , string message , string connID) 
    { 
     Clients.Client(connID).broadcastMessage(name , message); 
    } 
+4

$.connection.hub.id è 'undefined'? – ibiza

+1

Penso che 'Clients.Client (connID)' nel 'Send()' restituisce lo stesso client che in effetti chiama la funzione 'Invia' per cominciare con .. che significa che la funzione' Invia' trasmetterà effettivamente un messaggio allo stesso client . Qual è il punto? – Nawaz

10

Ogni volta che si invia un ri ricerca al server hub, la tua richiesta avrà un id di connessione differente, quindi ho aggiunto una tabella hash statica che contiene un nome utente, che non cambia continuamente e un id di connessione per il segnale r, ogni volta che ti colleghi, collegamento id sarà aggiornato

$.connection.hub.start().done(function() { 
    chat.server.registerConId($('#displayname').val()); 
}); 

e nel codice del server:

public class ChatHub : Hub 
{ 
    private static Hashtable htUsers_ConIds = new Hashtable(20); 
    public void registerConId(string userID) 
    { 
     if(htUsers_ConIds.ContainsKey(userID)) 
      htUsers_ConIds[userID] = Context.ConnectionId; 
     else 
      htUsers_ConIds.Add(userID, Context.ConnectionId); 
    } 
} 
1

Se l'utente specifico è in realtà il chiamante è di per sé, è possibile utilizzare:

Clients.Caller.myJavaScriptClientFunction(); 
0

quando si desidera inviare un messaggio a ID specifico

Clients.Client(Context.ConnectionId).onMessage(
       new Message{From = e.Message.From, Body = e.Message.Body} 
       ); 
Problemi correlati