2016-07-05 7 views
0

Ich habe eine Art Desktop-ähnliche Web-App mit ziehbaren Elementen, und bei jedem Objekt Drag-Drop wird die Datenbank mit neuen serialisierten Daten aktualisiert. Jedes Mal, wenn ein Benutzer sein Layout ändert, sollte sein gesamter angemeldeter Computer live aktualisiert werden.Senden von Daten an einen bestimmten Client durch den Windows-Benutzernamen des Clients mit SignalR

Wie würde ich um gehen die Daten nur für Benutzer mit dieser Eigenschaft zu senden:

User.Identity.Name 

Grundsätzlich sollte es in etwa so aussehen:

this.Clients.WithWindowsName("windowsusername").sendData(data); 

Antwort

3

Zuerst müssen Sie den Windows-Namen versenden zum Server. Der schnellste Weg ist, die er von dem Client als Header, weil es so in der Start() Aufruf enthalten, wird Ihnen eine zusätzliche proxy.Invoke() dont brauchen:

Client-Seite

_connection = new HubConnection(_uri); 
_connection.Headers.Add("windowsName", "John"); 
await _connection.Start(); 

Server-Seite

Dieser "WindowsName" Header wird Ihre Identität sein. Um sicherzustellen, dass SignalR diesen Header als die Identität erkennt, müssen Sie eine Implementierung von IUserIdProvider erstellen:

using Microsoft.AspNet.SignalR; 

namespace YourServer 
{ 
    public class UserIdProvider : IUserIdProvider 
    { 
     public string GetUserId(IRequest request) 
     { 
      return request.Headers.Get("windowsName"); 
     } 
    } 
} 

Und stecken Sie es dann in die globale Abhängigkeit Resolver:

public class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     var idProvider = new UserIdProvider(); 
     GlobalHost.DependencyResolver.Register(typeof(IUserIdProvider),() => idProvider); 

     // TODO configure signalR here 
    } 
} 

Wenn Sie User.Identity.Name zugreifen, es wird passe den "windowsName" an, aber du brauchst ihn nicht einmal, wie unten erklärt.

Wie Sie sagen, kann sich ein Benutzer von mehreren Computern aus anmelden. Der beste Weg, dies zu handhaben ist die Schaffung SignalR Gruppen:

public override Task OnConnected() 
{ 
    var windowsName = Context.Headers.Get("windowsName"); 
    Groups.Add(Context.ConnectionId, windowsName); 

    return base.OnConnected(); 
} 

Dies wird eine SignalR Gruppe mit dem Namen der Windows-Maschine erstellen. Wenn sich der Benutzer bei einem anderen Computer anmeldet, wird er zur selben Gruppe hinzugefügt. Sie müssen nichts in OnDisconnected entfernen, da SignalR sich darum kümmern wird.

Gruppen sind sehr praktisch, weil, wenn Sie eine Nachricht an eine Gruppe senden, werden alle angeschlossenen Maschinen benachrichtigt werden:

Clients.Group("John").sendData(data); 
Clients.Group(User.Identity.Name).sendData(data); 

Es ist also in Ordnung, eine Gruppe sogar für einen einzelnen Benutzer zu erstellen (von mehreren Verbindungs Maschinen).

+0

Dies ist sehr nützlich! Vielen Dank für diese tolle Antwort und eine sehr verständliche Erklärung! Guten Tag Ihnen! – Bodokh

Verwandte Themen