Session und Application ASP.NET Core changes

Sowohl in ASP.NET Webforms als auch ASP.NET MVC sind Session und Application Variablen vorhanden. Der Start und das Ende einer Application und Session wurde in der global.asax in den passenden End und Start Events behandelt.

Das ist alles weg mit ASP.NET Core. Man kann deutlich erkennen, das die zentrale Architektur des Webservers (IIS) nicht als Plattform dienen soll oder muss. Da passen solche schwergewichtigen Status behafteten Objekte im RAM des Internet Information Servers nicht dazu. Zudem muss ich einräumen seit Jahren keine Session Variablen mehr verwendet zu haben. Das Web in Persona HTTP ist statuslos konstruiert. Ich habe mich auch nachhaltig in das Konzept der URL als Status verguckt.

 

Komischerweise ist es gerade ASP.NET Core in dem ich seit langem wieder auf eine Session Variable setze um ein komplexes Token abzulegen.

Wie in ASP.NET Core üblich wird in der Startup.cs die Httppipeline per DI konfiguriert. Also statt Module in  Web.Config per XML in der Configure Methode app.UseSession(). Da gibt es technische Gründe dafür, ich mag es trotzdem nicht.

In gleicher Datei müssen die Startup Parameter codiert werden

   1:   public void ConfigureServices(IServiceCollection services)
   2:   {
   3:  ... 
   4:     services.AddSession(op => {
   5:       op.IdleTimeout = TimeSpan.FromMinutes(1);
   6:  //Session Timeout.  
   7:        });

Im Gegensatz zu früher und .NET Framework, gibt es dann kein Session Objekt in das man im Stile Key, Object alles persistieren kann. Per Set (ByteArray), SetInt und SetString wird geschrieben. Mit Get analog gelesen.

   1:  HttpContext.Session.SetString("User", "Hannes");

Nun die schlimmere Nachricht. Es gibt keine Events session_start oder gar session_end in die man sich reinhängen könnte.

 

Definitiv komplizierter, aber machbar. Code Migration ist kein copy paste sondern erfordert umfangreiche Handarbeit.

Vielleicht wird es ja mit dem Application Objekt besser. Mitnichten. Eine Application Variable soll als globale statisches Objekt existieren. Anwendungsfall die Anzahl der angemeldeten Benutzer.

Hier hilft das Pipeline Konzept durchaus. Objekte in der Pipeline werden Services genannt und man kann diese Services wiederum per DI in startup.cs reinkonfigurieren. In unserem Fall mit dem Entwurfsmuster Singleton, also nur eine Instanz.   services.AddSingleton<Application>()

Die Application Klasse ist selbst gestrickt.

   1:  public class Application
   2:  {
   3:          public int UserCounter { get; set; }
   4:  }
   5:  public class SessionStat
   6:   {
   7:     public SessionStat([FromServices] Application app)
   8:     {
   9:              app.UserCounter++;
  10:     }
  11:   
  12:      }

Wie man den User Counter manipuliert, bleibt der eigene Fantasie überlassen. Hier wurde noch ein Service zwischengeschaltet, der wiederum das Application Objekt per DI erhält. So rein aus akademischen Gründen.

In der cshtml.cs Page Method, kann genauso der Service per Methoden Attribut injiziert werden und die Variable inkrementiert. ( hört sich viel besser an als plus eins)

   1:  public void OnPost([FromServices] models.Application app)
   2:  {
   3:      app.UserCounter ++;
   4:  }

Ab ins deklarative HTML UI der Razor Page. Auch dort wird DI angewandt um C# Code in den HTML zu mischen.

   1:  @inject models.Application app
   2:  ...
   3:  <html>...
   4:  <body>
   5:      @app.UserCounter

Das sollte es gewesen sein. Event Empfehlung ADC Core

Kommentare sind geschlossen