web-dev-qa-db-fra.com

Appelez un client spécifique de SignalR

Je souhaite appeler un client spécifique à partir du serveur et ne pas le diffuser à tous. Le problème est que je suis dans le champ de certaines AJAX (dans .aspx codebehind, disons)), et non dans Hub ou PersistentConnection; ajax (jquery) call n’est pas le client que je veux envoyer le message de signal!

Maintenant, j'ai un concentrateur appelé lors du chargement de la page JS, qui enregistre un nouveau client dans la liste statique du serveur. J'ai donc des guides client. Mais je ne sais pas comment utiliser cela pour envoyer un message du serveur à un client spécifique.

63
Hrvoje Hudo
44
davidfowl
$('#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();
});

côté serveur envoie l'identifiant du client et la réponse à cet identifiant

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

Chaque fois que vous envoyez une demande au serveur concentrateur, votre demande aura un identifiant de connexion différent. J'ai donc ajouté une table de hachage statique contenant un nom d'utilisateur, qui ne change pas en permanence, ainsi qu'un identifiant de connexion du signal r, à chaque fois. vous vous connectez, l'identifiant de connexion sera mis à jour

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

et dans le code serveur:

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);
    }
}
10
Nada N. Hantouli

Si l'utilisateur spécifique est réellement l'appelant, vous pouvez utiliser:

Clients.Caller.myJavaScriptClientFunction();
1
radbyx

lorsque vous souhaitez envoyer un message à un identifiant spécifique

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