Auf 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:
Nach dem Klick auf *SetSession*
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:
- Man hat mehrere Webserver mit Loadbalancer. Maarten Balliauw hat darüber eine nette Serie geschrieben:
- ASP.NET load balancing and ASP.NET state server (aspnet_state)
- ASP.NET Session State Partitioning
- ASP.NET Session State Partitioning using State Server Load Balancing
- Solange man die Struktur der Sessiondaten nicht ändert kann man im Hintergrund die web.config ändern oder die ganze WebApp austauschen. Das ist natürlich praktisch für kleinere Bugfixes.
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)