Laden...

SignalR clientId zu eigenen Usern mappen

Erstellt von Sythus vor 9 Jahren Letzter Beitrag vor 9 Jahren 2.224 Views
S
Sythus Themenstarter:in
166 Beiträge seit 2009
vor 9 Jahren
SignalR clientId zu eigenen Usern mappen

Hallo zusammen,

ich habe in meiner Asp.net Anwendung SignalR laufen und speichere die clientIds in einer statischen Liste.

Wie kann ich diese clientIds nun auf meine internen User mappen?

In meinen Controllern habe ich keinen zugriff auf die clientId bzw. connectionId des users der diesen Aufruf durchführt.

Fallbeispiel:

1.Webseitenaufrufe -> Controller erstellt Datensatz mit clientId in der Datenbank (die brauch ich) 1.User schließt die Webseite -> SignalR erkennt das und löscht den Datensatz mit der clientId aus der Datenbank

Ich habe viel recherchiert und nur Fallbeispiele gefunden wo man die userId von SignalR in eine statische Liste schreibt. Leider fehlt mir dabei komplett die zuordnung zu meinem AKTUELLEN User.

Danke für jeden Hinweis

PS: Ich versteh auch irgendwie nicht ganz warum SingalR nicht problemlos sessionbasiert laufen kann.. dann wär das so schön einfach... 😦

742 Beiträge seit 2005
vor 9 Jahren
16.828 Beiträge seit 2008
vor 9 Jahren

SignalR unterstützt einfach keine Sessions.
Das liegt u.a. an der flexiblen Art und Weise, wie Duplex-Verbindungen zum Server aufgebaut werden; zB. Forever-Frames.
Sessions funktionieren nur, wenn Informtionen durch einen Request versendet werden. Bei einem Forever-Frame wird aber eine dauerhafte Verbindung aufgebaut und aufrecht erhalten. Es gibt hier also keine Chance Session Daten zu senden.
Und Forever-Frames sind für ältere Browser unbedingt notwendig. Es gibt hier keine Alternative.

Für jedes Fenster, das Du öffnest, wird eine eigene SignalR ClientID erstellt.
Hier nun mit einer Parallelität auf die Session zu agieren führt in den aller meisten Fällen zusätzlich zu Problemen.

Was Du brauchst ist ein ConnectionBag, in denen Du die IDs der User sammelst.
Dabei kannst Du den Username des Nutzers als Key speichern.

Dabei bietet sich die Aufteilung in Hub und Ticker an, wie es zum Beispiel in SignalR/SignalR-StockTicker gezeigt wird.
Oder das Minibeispiel in SignalR: how to survive accidental page refresh.

Beim Schließen der Webseite hast Du keine Möglichkeit weiterhin Javascript auszuführen.
Du musst hoffen, dass der OnDisconnect-Event von SignalR geworfen wird (wird er in 95% der Fälle). Bedenke aber, dass auch ein Neuladen der Seite OnDisconnect ausführt.

S
Sythus Themenstarter:in
166 Beiträge seit 2009
vor 9 Jahren

Hallo und entschuldigt die verspätete Antwort.

War wirklich sehr hilfreich - vielen Dank. Natürlich gibt mir die Aussage das OnDisconnect nur in 95% der Fälle geworfen wird etwas zu denken.

Irgendwelche Ideen wie man eventuelle Fehlerquoten abfängt oder korrigiert?

Gibt es die Möglichkeit eine Art Backgroundworker laufen zu lassen der unabhängig von einem Webseitenaufruf läuft? In diesem könnte man auf alte Sessions prüfen und ggf. auch ob ein Client noch da ist?

Danke schonmal und frohe Festtage!

Viele Grüße
Sythus

16.828 Beiträge seit 2008
vor 9 Jahren

OnDisconnect sollte zu 100% funktionieren - aber nicht 100% synchron.
Beim Close oder Change wird ein Ajax Request gesendet. Ist dieser erfolgreich (~95%, das war oben nicht so genau ausgedrückt), dann erfolgt OnDisconnect sofort. Wenn dieser nicht erfolgreich ist, dann wird dieser nach einem Timeout geworfen.
Wenn das nur für das Aufräumen relevant ist, dann reicht Dir das. Geht es Dir um das genaue Tracken, dann reicht das nicht. Das ist eben von der Anwendung abhängig.

S
Sythus Themenstarter:in
166 Beiträge seit 2009
vor 9 Jahren

Verstehe - danke, hatte es tatsächlich falsch verstanden... gibt es Möglichkeiten das ganze so zu erweitern das es für das genaue tracken reicht?

16.828 Beiträge seit 2008
vor 9 Jahren

Nein; geht technologisch nicht.
Es kann immer den Fall geben, dass ein Client kein Netz mehr hat.