Rufen Sie einen bestimmten Client von SignalR aus an

70

Ich möchte einen bestimmten Client vom Server aus anrufen und nicht an alle senden. Das Problem ist, dass ich mich im Umfang einer AJAX-Anfrage befinde (sagen wir in .aspx codebehind) und nicht in Hub oder PersistentConnection. Ich habe also keine Clients-Eigenschaft - und der Client, der diesen Ajax-Aufruf (jquery) ausgeführt hat, ist nicht der Client Ich möchte eine Signalnachricht senden!

Jetzt habe ich einen Hub, der beim Laden der JS-Seite aufgerufen wird und der einen neuen Client in der statischen Serverliste registriert, sodass ich Client-Guids habe. Aber ich weiß nicht, wie ich damit Nachrichten vom Server an einen bestimmten Client senden soll.

Hrvoje Hudo
quelle

Antworten:

46

Die neuesten Informationen finden Sie in den Dokumenten:

Persistente Verbindungen - https://github.com/SignalR/SignalR/wiki/PersistentConnection

Hubs - http://www.asp.net/signalr/overview/guide-to-the-api/hubs-api-guide-server

Davidfowl
quelle
3
"Client = Verbindung", sodass Sie bei jeder Anfrage eine neue Client-ID erhalten. In der nächsten Version von SignalR lassen Sie die Logik, die die Client-ID generiert, überschreiben, damit Sie sie mit etwas Relevanterem verknüpfen können. Im Moment sollten Sie eine Client-ID mit etwas verknüpfen, das für Ihre Anwendung relevant ist (z. B. Benutzername).
Davidfowl
4
Für diejenigen, die nicht daran interessiert sind, im Wiki zu stöbern (was ich sehr empfehlen kann - es ist fantastisch), scheint die Verbindung.BroadCast (clientId, messageHere) einfach durch Senden (clientId, Daten) ersetzt worden zu sein.
Nillls
21
Hat jemand ein Beispiel für das Festlegen der Client-ID, anstatt die automatisch generierte zu verwenden?
Herr Zorn
27
IMO, wenn Sie nur Links zur Dokumentation bereitstellen möchten, sollte dies nur ein Kommentar zu der Frage sein.
AaronLS
3
Diese Frage wird derzeit auf meta
26
$('#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();
});

Auf der Serverseite senden Sie die ID des Clients und die Antwort auf diese ID

  public void Send ( string name , string message , string connID )
  {
        Clients.Client(connID).broadcastMessage(name , message);
  }
user2201030
quelle
5
$ .connection.hub.id ist undefined?
Ibiza
2
Ich denke, Clients.Client(connID)in den Send()Retouren wird derselbe Client verwendet, der die SendFunktion zunächst tatsächlich aufruft. Dies bedeutet, dass die SendFunktion tatsächlich eine Nachricht an denselben Client sendet. Was ist der Sinn?
Nawaz
@Nawaz Sie geben tatsächlich connID ab, also ist das das Ziel. Man sollte jedoch weder Implementierungsdetails übergeben noch diese extern offenlegen. Eine Benutzer-ID sollte übergeben werden und möglicherweise ein statisches Wörterbuch mit Benutzer-IDs an Client-Proxys, die zum Zuordnen dieser IDs verwendet werden.
Chris Bordeman
Ist es sicher, die Verbindungs-ID vom Server an den Client zu übergeben, oder umgekehrt, fühlt sich das für mich wie eine Sicherheitslücke an?
Max Carroll
11

Jedes Mal, wenn Sie eine Anfrage an den Hub-Server senden, hat Ihre Anfrage eine andere Verbindungs-ID. Daher habe ich eine statische Hash-Tabelle hinzugefügt, die einen Benutzernamen enthält, der sich nicht ständig ändert, und jedes Mal eine Verbindungs-ID für das Signal r Wenn Sie eine Verbindung herstellen, wird die Verbindungs-ID aktualisiert

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

und im Servercode:

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

wenn Sie eine Nachricht an eine bestimmte ID senden möchten

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

Wenn der bestimmte Benutzer selbst der Anrufer ist, können Sie Folgendes verwenden:

Clients.Caller.myJavaScriptClientFunction();
Radbyx
quelle