Ich habe gerade festgestellt, dass jede Anforderung in einer ASP.Net-Webanwendung zu Beginn einer Anforderung eine Sitzungssperre erhält und diese am Ende der Anforderung freigibt!
Falls die Auswirkungen auf Sie verloren gehen, wie es zunächst für mich der Fall war, bedeutet dies im Grunde Folgendes:
Immer wenn das Laden einer ASP.Net-Webseite lange dauert (möglicherweise aufgrund eines langsamen Datenbankaufrufs oder was auch immer) und der Benutzer entscheidet, dass er zu einer anderen Seite navigieren möchte, weil er das Warten satt hat, KÖNNEN SIE NICHT! Die ASP.Net-Sitzungssperre zwingt die neue Seitenanforderung zu warten, bis die ursprüngliche Anforderung schmerzhaft langsam geladen wurde. Arrrgh.
Immer wenn ein UpdatePanel langsam geladen wird und der Benutzer beschließt, zu einer anderen Seite zu navigieren, bevor das UpdatePanel die Aktualisierung abgeschlossen hat ... SIE KÖNNEN NICHT! Die ASP.net-Sitzungssperre zwingt die neue Seitenanforderung zu warten, bis die ursprüngliche Anforderung schmerzhaft schmerzhaft geladen wurde. Double Arrrgh!
Welche Möglichkeiten gibt es? Bisher habe ich mir Folgendes ausgedacht:
- Implementieren Sie einen benutzerdefinierten SessionStateDataStore, den ASP.Net unterstützt. Ich habe nicht zu viele gefunden, um sie zu kopieren, und es scheint ein hohes Risiko zu sein und leicht durcheinander zu bringen.
- Behalten Sie den Überblick über alle laufenden Anforderungen. Wenn eine Anforderung vom selben Benutzer eingeht, brechen Sie die ursprüngliche Anforderung ab. Scheint irgendwie extrem, aber es würde funktionieren (glaube ich).
- Verwenden Sie keine Sitzung! Wenn ich einen Status für den Benutzer benötige, kann ich stattdessen einfach Cache und Schlüsselelemente für den authentifizierten Benutzernamen oder ähnliches verwenden. Scheint wieder irgendwie extrem.
Ich kann wirklich nicht glauben, dass das ASP.Net Microsoft-Team bei Version 4.0 einen so großen Leistungsengpass im Framework hinterlassen hätte! Vermisse ich etwas Offensichtliches? Wie schwierig wäre es, eine ThreadSafe-Sammlung für die Sitzung zu verwenden?