Session-Zugriffe in ASP.NET sind langsam

Sowohl ASP.NET Web Forms als auch MVC sind beim Zugriff auf Sitzungsvariablen („Session“) mit einiger Vorsicht zu genießen:

Access to the session state is per session exclusive, which means that a request to the session state applies an exclusive lock on the session object. Other requests trying to access the same session object concurrently will then have to wait until the first request has completed and released the lock. On the other hand, concurrent requests accessing different sessions can be handled concurrently.

(Zitat von hier)

D.h. bei vielen Anfragen hängt unter Umständen die Performance deutlich nach unten durch. Wir haben das selbst auch schon erlebt.

Dann ist oft im IIS-Live-Zugriffs-Log zu sehen, dass es viele Einträge mit „AcquireRequestState“ gibt. Das deutet darauf hin, dass zu viele Anfragen kommen, und die Session-Zugriffe der Flaschenhals sind.

Es gibt hier verschiedene Ansätze, die Verwendung des eingebauten Sessions-Handlings zu umgehen. Z.B.:

Ich selbst nutze bisher noch fast nichts davon, ab und zu die SessionStateBehaviour-Enumeration.

In ASP.NET Core ist das Verhalten des eingebauten Session-Handlings wohl besser steuerbar.

Auf dieser Website habe ich noch einen weiteren Tipp gefunden:

Ist ein NuGet-Paket „Microsoft.AspNet.SessionState.SessionStateModule“, mit dem folgende Ergänzungen via „web.config“-Datei möglich sind:

<appSettings>
    <add key="aspnet:RequestQueueLimitPerSession"       value="2147483647" />
    <add key="aspnet:AllowConcurrentRequestsPerSession" value="true" />
</appSettings>

Damit könnte also die Parallelisierung der gleichzeitigen Session-Zugriffe pro einzelnem Benutzer verbessert bzw. überhaupt erst ermöglicht werden.

Im GitHub-Repository schreibt Microsoft zum „aspnet:AllowConcurrentRequestsPerSession“-Eintrag:

If multiple requests with same sessionid try to acquire sessionstate concurrently, asp.net only allows one request to get the sessionstate. With this setting, asp.net will allow multiple requests with same sessionid to acquire the sessionstate, but it doesn’t guarantee thread safe of accessing sessionstate.