Für Webanwendungen gibt es spezielle Anforderungen, die berücksichtigt werden müssen. Für jeden Client wird eine Session gestartet, in dem ein- oder mehrmals ein Request angefordert wird. Für die Verarbeitung eines Request steht auf dem Webserver aber nur eine begrenzte Anzahl Ressourcen (Prozesse, Threads bzw. Zum Wörterbuch hinzufügen) zur Verfügung, die von dem Internet Information Server (IIS) für die unterschiedlichen Requests wiederverwendet werden. Dadurch können einzelne Requests innerhalb einer Session in unterschiedlichen AppDomains, Prozessen oder sogar auf unterschiedlichen Rechnern ausgeführt werden.
Außerdem werden je nach Programmiermodell (ASP.NET WebForms, MVC, …) für die Implementierung bestimmte Basisklassen vorausgesetzt, welche sich um die Aufbereitung des Ergebnisses (i.e. rendering) kümmern. An hiervon abgeleiteten Klassen müssen dann bestimmte Methoden implementiert bzw. übersteuert werden, welche von IIS für den jeweiligen Request aufgerufen werden.
Deswegen wird für WEBA
Bausteine keine Methode RunImplementation
erzeugt, welche für die Implementierung übersteuert werden muss. Statt dessen wird in der Basisklasse eine statische Methode GetSessionInstance
erzeugt, welche verwendet werden kann, um die Instanz während der Verarbeitung eines Requests zu liefern:
namespace WebApp { public class MySessionModule: HL.Modules.Weba.Twonly.HlWebaTest { ... public static MySessionModule Instance => GetSessionInstance<MySessionModule>(); ...
WEBA
gelten die gleichen Regeln für die Implementierungsspezifikation, allerdings muss als Implementierungstyp ASPCLR eingetragen werden.
Damit die Infrastruktur in der Lage ist, die richtige Instanz zu erzeugen und für die Verarbeitung eines Requests zur Verfügung zu stellen, muss die Implementierungsklasse in der Web.config
als sog. HTTP Module eingetragen werden. Je nachdem, ob die Web-Anwendung im sog. Classic Mode oder Intergrated Mode läuft, muss der Eintrag an unterschiedlichen Stellen erfolgen:
<system.web> <httpModules> <add type="WebApp.MySessionModule" name="HlWebaTestSessionModule" /> </httpModules> </system.web>
<system.webServer> <modules> <add type="WebApp.MySessionModule" name="HlWebaTestSessionModule" /> </modules> </system.webServer>
Web.config
automatisch vorgenommen, und ggf. bei Änderungen auch angepasst.
Die Infrastruktur legt beim jedem Request eine Instanz dieser Implementierungsklasse an. Wenn der Request beendet wird, werden die Daten (z.B. Objekteinhalte) für die Instanz gesichert und beim nächsten Request verwendet, um die neue Instanz zu initialisieren. Bevor ASP.NET dann die für Implementierung des Requests ermittelte Methode auslöst, wird die Methode BeginRequest
an der Instanz der Implementierungsklasse ausgelöst. Nachdem ASP.NET die Kontrolle zurückbekommt, und bevor die Daten gesichert werden, wird die Methode EndRequest
an der Instanz der Implementierungsklasse ausgelöst. Diese beiden Methoden können ggf. übersteuert werden, um entsprechend reagieren zu können.
Da es sich bei Bausteinen vom Typ WEBA
um Einstiegsbausteine handelt, können hier auch die Eigenschaften und Methoden, welche hier beschrieben sind, verwendet werden. Zusätzlich stehen die nachfolgend beschriebenen Eigenschaften und Methoden zur Verfügung.
protected Boolean IsReentry { get; }
Liefert false
für die 1. Anforderung in einer Sitzung, true
für alle nachfolgenden.
public void RestartSession(HttpContext httpContext)
Diese Methode kann verwendet werden1), um die aktuelle SessionModule-Instanz neu zu initialisieren, um z.B. geänderte Eigenschaften zu berücksichtigen. Die aktuelle HttpContext
-Instanz muss explizit übergeben werden.
Für ASP.NET Core steht die Eigenschaft HttpContext.Current
nicht mehr zur Verfügung. Siehe hier für die unterschiedliche Möglichkeiten, um auf die aktuelle HttpContext
Instanz zu zu greifen.
public void RestartSession()
Ruft die Methode RestartSession
mit HttpContext.Current
auf. Diese Methode kann nur in .NET Framework verwendet werden.
Dieser Abschnitt ist in Bearbeitung, und kann ggf. noch angepasst werden.
Für die Integration von HTTP Module und HTTP Handler unter ASP.NET Core spielt die Web.config
keine Rolle mehr, sondern die HTTP Pipeline wird mittels einer Reihe spezieller Extension-Methoden konfiguriert (Details). Für ASP.NET Core gibt es eine Klasse SessionModuleExtensions
2), in der Extension-Methoden für die Integration eines TAA SessionModule
in die Middleware definiert sind. Diese Methoden können da verwendet werden wo Session State konfiguriert wird.
public static IServiceCollection AddSessionModule<T>(this IServiceCollection services, Action<SessionOptions> configure = null) where T : SessionModule
Fügt Dienste hinzu, die für die TAA SessionModule
-Unterstützung benötigt werden. Dazu gehören auch die Dienste, die für den Anwendungssitzungszustand erforderlich sind. Diese Methode kann anstatt SessionServiceCollectionExtensions.AddSession(IServiceCollection)
verwendet werden.
public static IApplicationBuilder UseSessionModule<T>(this IApplicationBuilder builder, SessionOptions options = null) where T : SessionModule
Fügt der Anforderungspipeline der Anwendung die TAA SessionModule
-Middleware hinzu. Dazu gehört auch die Middleware, die für den Anwendungssitzungszustand erforderlich ist. Diese Methode kann anstatt SessionMiddlewareExtensions.UseSession(IApplicationBuilder)
verwendet werden.