21 March 2010 HowTo, Session Robert Muehsig

imageAuf die Session ist in ASP.NET relativ simpel zuzugreifen. Im Standardfall läuft die Session im IIS Prozess mit. Wenn man also mal den IIS neustarten muss oder die web.config anpassen muss, dann wird der Prozess neugestartet und die Session geht verloren. Eine einfache Variante dies zu umgehen ist den ASP.NET Session State Server zu verwenden.

Auf die Session zugreifen

Hier mal der wesentliche Session-Zugriff (im Controller einer ASP.NET MVC Anwendung)

        public ActionResult Index()
        {
            if(this.Session["Foobar"] != null) {
                ViewData["Message"] = "Session: " + this.Session["Foobar"];
            }
            else {
                ViewData["Message"] = "Session empty";
            }
            return View();
        }

Session setzen:

        public ActionResult SetSession()
        {
            this.Session["Foobar"] = "Yeah - " + DateTime.Now.ToShortTimeString() + ":" + DateTime.Now.Second.ToString();
            return RedirectToAction("Index");
        }

Resultat

Foobar noch nicht in der Session gesetzt:

image

Nach dem Klick auf *SetSession*

image

Probleme bei "InProc"

ASP.NET bietet mehrere Session State Modes. Im Standardfall ist dieser auf "InProc" und hängt am IIS Prozess. Auch bei einer Web.config Änderung wird der Prozess für diese Website neugestartet und die Session ist wieder leer. Es gibt mehrere Szenarien wo dies zu Problemen führen kann:

Was muss man für den ASP.NET Session State Server konfigurieren?

Der "ASP.NET Session State Service"/"ASP.NET Sitzungszustand Dienst" muss laufen. Dieser Dienst wird mit dem .NET Framework mit installiert, allerdings nicht gestartet. Dann noch dieser Web.config Eintrag und wir sind schon fertig:

    <sessionState mode="StateServer"
      stateConnectionString="tcpip=localhost:42424"
      cookieless="false"
      timeout="20"/>

Wenn man mehrere Maschinen hat, sollte man sich an die Blogserie von Maarten Balliauw halten.

Jetzt kann man die web.config ändern und den Server wild hoch und runterfahren - solange der ASP.NET Sitzungszustandsdienst läuft :)

Andere Möglichkeiten: SQL Server, Custom

Man kann die Session auch in den SQL Server packen, aber ich bin mir nicht sicher ob das wirklich schnell ist. Natürlich kann man auch seinen eigenen Mechanismus überlegen. Scott Hanselman hat in einem Blogpost mal eine nette Übersicht erstellt.

Ist das eigentlich noch aktuell oder gibt es schon neueres/tolleres?

Da der Blogpost von Herrn Hanselman ja doch schon etwas älter ist, wollte ich mal in die Runde fragen ob diese Varainte irgendwelche Risiken birgt oder ob man heutzutage was anderes macht. Für Feedback wäre ich dankbar :)

[ Download Democode ] (Achtung: Der Dienst muss gestartet sein)


Written by Robert Muehsig

Software Developer - from Saxony, Germany - working on primedocs.io. Microsoft MVP & Web Geek.
Other Projects: KnowYourStack.com | ExpensiveMeeting | EinKofferVollerReisen.de