2015-07-03 3 views
7

Ich versuche SignalR mit MVC4 C# Projekt zu verwenden, um Push-Benachrichtigung nur an ausgewählte Clients zu senden. Dafür verwende ich 'context.Clients.Client' durch Speichern von 'Context.ConnectionId' in C# statische Variable {seit der Verwendung der Sitzung mit Signal}. Aber da 'contextConnectionId' eine statische Variable ist; Gibt es eine Alternative zur Sitzung mit Signal oder andere elegante Art und Weise wird die Nachricht nochSignalR Push-Benachrichtigung an bestimmten Client mit MVC4

:(an alle Clients boardcasted dies zu tun

Code wie unten angegeben (einige ähnliche Post, aber keine spezifischen Antworten gefunden):

javaScript

$(document).ready(function(){ 
{ 
    var chat = $.connection.PushNotify; 
    chat.client.addNewMessageToPage = function (type, message) { 
     if(type == "something") 
     { 
      alert(message); 
     } 
    } 
    // Start the connection. 
    $.connection.hub.start().done(function() { 
     chat.server.send($('').val(), $('').val()); 
    }); 
)} 

In C# HUB

[HubName("PushNotify")] 
public class PushNotify : Hub 
{ 
    public void Send(string name, string message) 
    { 
     //assume its c# static variable 
     GlobalVariable.contextConnectionId = Context.ConnectionId; 
    } 
} 
public class PushNotification 
{ 
    public void SendMessage(string message, string type = "msg") 
    { 
     if (!string.IsNullOrEmpty(GlobalVariable.contextConnectionId)) 
     { 
      var context = GlobalHost.ConnectionManager.GetHubContext<PushNotify>(); 
      context.Clients.Client(GlobalVariable.contextConnectionId).addNewMessageToPage(type, message); 
     } 

    } 
} 
+0

Ich glaube, Sie verwenden group.http können: //www.asp.net/signalr/overview/guide-to-the-api/working-with -groups – chenZ

+0

Das ist vielleicht auch einen Blick wert: http://www.asp.net/signalr/overview/guide-to-the-api/mapping-users-to-connections – NigelK

Antwort

6

Ich glaube nicht, dass Ihr Beispiel wie erwartet funktioniert. Wenn Sie Ihre Verbindung zu Ihrer statischen Variablen zuordnen, überschreiben Sie Ihre statische Variable tatsächlich mit der letzten Verbindung, die die Send-Methode aufgerufen hat.

Jeder Client, der eine Verbindung zu einem Hub herstellt, übergibt eine eindeutige Verbindungs-ID. Sie können diesen Wert in der Context.ConnectionId-Eigenschaft des Hubs Kontext abrufen.

Das bedeutet, dass Ihre GlobalVariable.contextConnectionId keine einfache Zeichenfolge sein kann. Sie müssen Ihre Clients auf eine Weise zuordnen, und jeder Client erhält eine eindeutige Verbindungs-ID. Vielleicht wäre hier ein Wörterbuch oder eine eigene Klasse mit mehr Informationen ausreichend. (Dh Browser Info, IP adderss ...)

(Zitat aus diesem Link ist) Dies soll Ihnen helfen: http://www.asp.net/signalr/overview/guide-to-the-api/mapping-users-to-connections

EDIT

Providing ein bisschen mehr Informationen:

I glaube, die einfachste Lösung für deine Frage ist die Verwendung von Gruppen. http://www.asp.net/signalr/overview/guide-to-the-api/working-with-groups

würde Ihr Hub Klasse eine Methode enthalten, einer Gruppe beizutreten:

public Task JoinGroup(string groupName) 
{ 
    return Groups.Add(Context.ConnectionId, groupName); 
} 

public Task LeaveGroup(string groupName) 
{ 
    return Groups.Remove(Context.ConnectionId, groupName); 
} 

Und lasst uns einen Postmessage zu einer Gruppe sagen, die nur für eine bestimmte Gruppe sendet:

public void SendMessage(string groupName, string message, string type = "msg") 
{ 
    var context = GlobalHost.ConnectionManager.GetHubContext<PushNotify>(); 
    context.Clients.Group(groupName).addNewMessageToPage(type, message); 
} 

Wenn Ihre Kunden kommen Sie können sich mit einer Gruppe verbinden und alles andere wird von SignalR behandelt.

die Gruppe von Kunden und Posting Nachricht Joining:

var chat = $.connection.PushNotify; 
$.connection.hub.start().done(function() { 
    chat.server.joinGroup("Group1"); 
    chat.server.sendMessage("Group1", "Hi There"); 
}); 

Empfangen von Nachrichten ist die gleiche

chat.client.addNewMessageToPage = function (type, message) { 
    ... 
} 

andere Lösung

Eine andere Lösung könnte Ihr eigenes Mapping oder sein mit SignalR Verbindungszuordnung. Diese Lösungen müssen die Methoden OnConnected und OnDisconnected überschreiben und Ihre Verbindungen zuordnen. dh:

private readonly static ConnectionMapping<string> _connections = 
     new ConnectionMapping<string>(); 

public override Task OnConnected() 
{ 
    string name = Context.User.Identity.Name; 
    _connections.Add(name, Context.ConnectionId); 
    return base.OnConnected(); 
} 

public override Task OnDisconnected(bool stopCalled) 
{ 
    string name = Context.User.Identity.Name; 
    _connections.Remove(name, Context.ConnectionId); 
    return base.OnDisconnected(stopCalled); 
} 

public void SendChatMessage(string who, string message) 
{ 
    string name = Context.User.Identity.Name; 
    foreach (var connectionId in _connections.GetConnections(who)) 
    { 
     Clients.Client(connectionId).addChatMessage(name + ": " + message); 
    } 
} 

Wie in diesem Beispiel: http://www.asp.net/signalr/overview/guide-to-the-api/mapping-users-to-connections#inmemory

+0

@D Dan: Kannst du etwas illustrieren bezüglich der Verwendung eines Wörterbuchs in diesem Zusammenhang. –

+0

Über die erste (Gruppen-) Version: Wo/wann der Kunde LeaveGroup anruft? –

+0

Als Beispiel, wenn ich eine Karte habe, die nach Elementtypen (Fahrzeug, Benutzer ...) sucht, kommen diese aus dem Feed (SignalR) durch ihre spezifischen Gruppen. Wenn ich z. B. Fahrzeuge auf der Benutzeroberfläche ausfiltern würde, könnte ich ebenso die Fahrzeuggruppen-Aktualisierungen verlassen, da ich sie nicht einmal mehr anzeige, ich brauche keine aktuellen Daten, es wäre nur unnötiger Verkehr. – DDan

Verwandte Themen