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... 😦
Schau dir mal das an: Authentication and Authorization for SignalR Hubs
ImageTools for Silverlight: http://imagetools.codeplex.com | http://www.silverdiagram.net | http://www.cleancodedeveloper.de b:::
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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
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.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code
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?
Nein; geht technologisch nicht.
Es kann immer den Fall geben, dass ein Client kein Netz mehr hat.
- performance is a feature -
Microsoft MVP - @Website - @AzureStuttgart - github.com/BenjaminAbt - Sustainable Code