Ich kann nicht funktioniert die Nachricht an einen bestimmten Benutzer aus dem Code hinter zu senden. Clients.All
funktioniert, Clients.AllExcept(userId)
funktioniert, aber nicht Client.User(userId)
.Kann nicht senden Nachricht an bestimmte Benutzer mit SignalR
Meine Nabe:
public class MessagingHub : Hub
{
public override Task OnConnected()
{
var signalRConnectionId = Context.ConnectionId;
// for testing purpose, I collect the userId from the VS Debug window
System.Diagnostics.Debug.WriteLine("OnConnected --> " + signalRConnectionId);
return base.OnConnected();
}
}
Meine Controller hinter Nachricht von Code zu senden:
public void PostMessageToUser(string ConnectionId)
{
var mappingHub = GlobalHost.ConnectionManager.GetHubContext<MessagingHub>();
// doesn't works
mappingHub.Clients.User(ConnectionId).onMessageRecorded();
// doesn't works
mappingHub.Clients.Users(new List<string>() { ConnectionId }).onMessageRecorded();
// works
mappingHub.Clients.All.onMessageRecorded();
// works (?!)
mappingHub.Clients.AllExcept(ConnectionId).onMessageRecorded();
}
Wie meine Nabe auf der JS initialisiert wird:
var con, hub;
function StartRealtimeMessaging()
{
con = $.hubConnection();
hub = con.createHubProxy('MessagingHub');
hub.on('onMessageRecorded', function() {
$(".MessageContainer").append("<div>I've received a message!!</div>");
});
con.start();
}
Und schließlich, wie ich eine (n leer) Nachricht an den Hub senden:
function TestSendToUser(connectionId)
{
$.ajax({
url: '/Default/PostMessageToUser',
type: "POST",
data: { ConnectionId: connectionId},// contains the user I want to send the message to
});
}
So funktioniert es perfekt mit mappingHub.Clients.All.onMessageRecorded();
aber nicht mit mappingHub.Clients.User(ConnectionId).onMessageRecorded();
oder mappingHub.Clients.Users(new List<string>() { ConnectionId}).onMessageRecorded();
.
Aber interessanter, es funktioniert mit mappingHub.Clients.AllExcept(ConnectionId).onMessageRecorded();
: Alle Benutzer verbunden, um die Nachricht mit Ausnahme der angegebenen Benutzer-ID erhalten, was bedeutet, dass die Benutzer-ID ist gut, und der Benutzer ist gut identifiziert. Warum funktioniert Clients.User(ConnectionId)
nicht?
+1 für die Antwort, aber, .. .. Erstellen von Gruppen von nur einem Benutzer ist ein Workaround, und keine echte Lösung. Ich kann nicht glauben, dass der 'Clients.User (srUserId)' nicht funktioniert ... –
Nun, endlich habe ich die Antwort gefunden. Siehe meine Antwort. (hoffe es hilft dir auch;)) –
Du hast recht, ich hätte 'Workaround' verwenden sollen - ich habe geantwortet. Und brillante Arbeit, um die richtige Antwort zu finden. Die Problemumgehung .Group() hat eine elegante Eigenschaft, da SignalR die internen Beziehungen userID/ConnectionID verwaltet, was bedeutet, dass BenutzerID direkt in den Nachrichtenanforderungen verwendet werden kann, ohne dass die Beziehungen separat gepflegt werden müssen. Als Testumgehung dafür hatte ich ConnectionID der Benutzerdb-Tabelle hinzugefügt. Das wollte ich im Live-db nicht machen. –