# Session-Zugriffe in ASP.NET sind langsam

**URL:** <https://entwicklergate.de/t/session-zugriffe-in-asp-net-sind-langsam/219>\
**Category:** ASP.NET\
**Tags:** asp.net, session\
**Created:** [24. Juli 2017 um 05:59 UTC](https://entwicklergate.de/t/session-zugriffe-in-asp-net-sind-langsam/219 "2017-07-24T05:59:42Z")\
**Posts on this page:** 2\
**Page:** 1

<div class="post-metadata">

**Author:** ![UweKeim](https://entwicklergate.de/user_avatar/entwicklergate.de/uwekeim/32/432_2.png) [@UweKeim](https://entwicklergate.de/u/UweKeim)\
**Post date:** [24. Juli 2017 um 05:59 UTC](https://entwicklergate.de/t/session-zugriffe-in-asp-net-sind-langsam/219/1 "2017-07-24T05:59:42Z")

</div>

Sowohl [ASP.NET](http://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](https://web.archive.org/web/20180103020155/http://infozone.se/handling-concurrent-access-asp-net-mvcs-session-state))

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.:

- [Die `SessionStateBehaviour`-Enumeration auf MVC-Controller anwenden](http://infozone.se/handling-concurrent-access-asp-net-mvcs-session-state/). Unter Web Forms geht das mit [dem `EnableSessionState`-Attribut in der Page-Direktive](https://stackoverflow.com/a/3629757/107625).
- [Mit eigenen Session-Cookies arbeiten](https://blog.falafel.com/implementing-user-sessions-in-asp-net-without-sessionstate/).
- Mit Redis arbeiten. Z.B. [hier](https://github.com/Azure/aspnet-redis-providers) oder [hier](https://libraries.io/github/angieslist/AL-Redis) als fertiger Ersatz-Session-Provider.
- Hier noch [eine Bibliothek mit anderen Alternativen](https://github.com/dermeister0/LockFreeSessionState).
- [Anonymous Identification](http://www.toplinestrategies.com/blogs/net/anonymous-identification-mvc) in MVC aktivieren und nutzen.

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](https://docs.microsoft.com/de-de/aspnet/core/fundamentals/app-state?view=aspnetcore-2.1#load-session-state-asynchronously) wohl besser steuerbar.

---

<div class="post-metadata">

**Author:** ![UweKeim](https://entwicklergate.de/user_avatar/entwicklergate.de/uwekeim/32/432_2.png) [@UweKeim](https://entwicklergate.de/u/UweKeim)\
**Post date:** [14. März 2019 um 06:54 UTC](https://entwicklergate.de/t/session-zugriffe-in-asp-net-sind-langsam/219/2 "2019-03-14T06:54:47Z")

</div>

Auf [dieser Website](https://world.episerver.com/blogs/mahdi-shahbazi/dates/2018/10/the-request-queue-limit-of-the-session-is-exceeded--system-web-httpexception-at-system-web-sessionstate-sessionstatemodule-queueref/?AspxAutoDetectCookieSupport=1) habe ich noch einen weiteren Tipp gefunden:

> **[GitHub - aspnet/AspNetSessionState: ASP.NET Session State (not for ASP.NET Core)](https://github.com/aspnet/AspNetSessionState)**
>
> ASP.NET Session State (not for ASP.NET Core). Contribute to aspnet/AspNetSessionState development by creating an account on GitHub.

Ist ein NuGet-Paket „[Microsoft.AspNet.SessionState.SessionStateModule](https://www.nuget.org/packages/Microsoft.AspNet.SessionState.SessionStateModule/)“, mit dem folgende Ergänzungen via „web.config“-Datei möglich sind:

```xml
<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](https://github.com/aspnet/AspNetSessionState#microsoftaspnetsessionstatesessionstatemodule) zum „aspnet:AllowConcurrentRequestsPerSession“-Eintrag:

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