2012-05-15 17 views
6

Wie erhalte ich die Klienten connectionId/clientId außerhalb des Hub .. Ich habe es geschafft, Folgendes zu tun:Get connectionId außerhalb von Hub, SignalR

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 

Aber in diesem Zusammenhang Objekt gibt es keine so etwas wie ein clientId.

Antwort

4

Sie können IConnected/IDisconnect auf dem Hub implementieren und die Clients beispielsweise in einer Datenbank manuell nachverfolgen und dann bei Bedarf die Liste zurückziehen. Das Beispiel ist unten aus dem SignalR Wiki

public class Status : Hub, IDisconnect, IConnected 
{ 
    public Task Disconnect() 
    { 
     return Clients.leave(Context.ConnectionId, DateTime.Now.ToString()); 
    } 

    public Task Connect() 
    { 
     return Clients.joined(Context.ConnectionId, DateTime.Now.ToString()); 
    } 

    public Task Reconnect(IEnumerable<string> groups) 
    { 
     return Clients.rejoined(Context.ConnectionId, DateTime.Now.ToString()); 
    } 
} 
4

Warum sollte es eine Verbindung Id auf dem globalen Kontext sein? Welcher Zusammenhang wäre es in Bezug auf? Wenn Sie den globalen Kontext abrufen, greifen Sie auf einen Einwegkanal von Server zu Client zu und können Nachrichten darüber senden. Sie haben keinen Zugriff auf die Verbindungs-ID des Hubs, da Sie nicht darauf zugreifen. Sie können sie irgendwo in Ihrer Anwendung speichern, wenn Sie sie benötigen.

+2

Nicht jeder baut Chat-Server. Ich denke implizit war, wie die ConnectionId, die vom aktuellen Client verwendet wird, abgerufen werden kann, damit eine Nachricht nur an diesen Benutzer/diese Sitzung gesendet werden kann. Ich frage mich, wie ich dies am besten in einer MVC-Aktion von einem Client aus tun kann, wo ich Fortschrittsnachrichten senden möchte. Es gibt einige Techniken, ConnectionIds durch den Benutzernamen zwischenzuspeichern, aber ich habe nichts Anständiges gesehen, um zuzulassen, dass derselbe Benutzer mehrere Verbindungen hat, was bei Web-Apps oft der Fall ist. Ideen dafür? Vielen Dank. – Dave

+4

Sie senden es vom Client an Ihre mvc Aktion. Es ist auf dem Client über $ .connection.hub.id verfügbar. – davidfowl

1

Hier ist die Lösung. Sie können eine Methode innerhalb der hub aufrufen und Sie können die connection ID von dort zurückgeben.

Kontroller

var context = GlobalHost.ConnectionManager.GetHubContext<MyHub>(); 
MyHub _connectedHub= new MyHub(); 
var connectedUserID = _connectedHub.GetConnectionID(); 

In Hub

public string GetConnectionID() 
{ 
    return "Your Connection ID as String" //This can be stored in a list or retrieved in any other method 
} 

werden Sie ID außerhalb der Nabe erhalten in connectedUserID Variable erforderlich. Hoffnung, die hilft.

Verwandte Themen