SignalR - Nachricht Senden OnConnected
Ich habe experimentiert mit SignalR heute und Es ist wirklich ordentlich. Im Grunde, was ich erreichen wollte, ist die folgende:
Sobald ein Gerät verbunden, es sollte eine Nachricht senden zu der ersten. Wenn es mehr Geräte als 1 angeschlossen ich möchte zum senden von zwei Nachrichten. Einer für alle außer der Letzte verbundene client. Und eine Nachricht an nur der Letzte verbundene client.
Den code, den ich benutzt habe funktioniert perfekt, wenn ich ihn in einer benutzerdefinierten API-controller und im Grunde nennen die Aktion, aber das ist nicht das, was ich will.
Ich würde gerne um die Nachrichten zu senden, sobald das Gerät eine Verbindung innerhalb OnConnected
ohne Interaktion mit dem Benutzer, aber wenn ich meinen code innerhalb der OnConnected
überschreiben, Stoppt es zu arbeiten. Es sendet nicht auf die spezifischen Kunden mehr (zuerst angeschlossen und zuletzt verbunden).
Ich hoffe, jemand kann mir helfen, weil ich habe schlug meinen Kopf für ein paar Stunden jetzt.
public override System.Threading.Tasks.Task OnConnected()
{
UserHandler.ConnectedIds.Add(Context.ConnectionId, UserHandler.ConnectedIds.Count + 1);
int amountOfConnections = UserHandler.ConnectedIds.Count;
var lastConnection = UserHandler.ConnectedIds.OrderBy(x => x.Value).LastOrDefault();
var allExceptLast = UserHandler.ConnectedIds.Take(amountOfConnections - 1).Select(x => x.Key).ToList();
if (amountOfConnections == 1)
{
Clients.Client(UserHandler.ConnectedIds.First().Key).hello("Send to only(also first) one");
}
else
{
Clients.Clients(allExceptLast).hello("Send to everyone except last");
Clients.Client(lastConnection.Key).hello("Send to only the last one");
}
return base.OnConnected();
}
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es sei denn, ich vermisse etwas von deiner Frage, die Lösung sieht ganz einfach zu mir, Sie brauchen nur den Schalter zu verwenden
anstatt zu versuchen, sich selbst zu verstehen, die die Letzte id verbunden. Dasselbe für die anderen diejenigen, die Sie verwenden können:
Brauchen Sie nicht, um die Logik der Einstellung, die 2 Zeilen tun, was Sie brauchen, und Sie arbeiten im inneren
OnConnected
.Dank für all die Hilfe, die (von Ihnen positiv bewertet werden Euch). Tatsächlich das problem gefunden.. es war in meinem client. Ich zum ersten Abonnenten des 'hello' - Funktion und nach, dass ich begann, die HubConnection. Sobald ich dies geändert, um alles gut geklappt hat.
Arbeitete Sie mit den folgenden client-code:
Da Sie noch nicht eingerichtet, eine Verbindung noch, zu versuchen, rufen Sie Ihre Kunden
.hello()
Funktion innerhalbOnConnected
ist nicht möglich an dieser Stelle. Allerdings können wir definieren ein server-hub-Methode und rufen Sie sofort, dass Sie auf unsere Verbindung.done
Rückruf. Dann, in unserer neuen server-Methode können wir eine Neuverteilung der Logik, die Sie derzeit inOnConnected
.Dies wird sich ändern, unser setup schon ein bisschen, und stellen Sie einige zusätzliche Schritte, aber beachten Sie das folgende Beispiel...
So die grundlegende Idee hier ist, um erste
.done(function() { ... });
server.afterConnected()
.hello()
- client-FunktionHinweis - diese Ausführung ist für einen JavaScript-client - aber die gleiche Idee umgesetzt werden kann, um ein .net-client. Dies ist vor allem ein architektonisches Problem.
gut... das Sie wieder eine Aufgabe... also ich denke, dass das Problem möglicherweise...
sollten Sie erst ausführen, Ihren code und dann wieder die Aufgabe... oder setzen Sie einen ContinueWith... wie...
Habe ich noch nicht getestet... das ist einfach nur eine Vermutung..