Inkrementelle Migration des Sitzungszustands von ASP.NET zu ASP.NET Core

Sitzungszustand

Der Sitzungszustand in ASP.NET Framework bot eine Reihe von Features, die in ASP.NET Core nicht zur Verfügung stehen. Für die Aktualisierung von ASP.NET Framework auf Core bieten die Adapter Mechanismen, die das Auffüllen des Sitzungszustands mit einem ähnlichen Verhalten wie System.Web ermöglichen. Nachfolgend werden einige der Unterschiede zwischen Framework und Core aufgeführt:

  • ASP.NET Framework sperrt die Sitzungsnutzung innerhalb einer Sitzung, sodass nachfolgende Anforderungen in einer Sitzung seriell verarbeitet werden. Dies ist ein Unterschied gegenüber ASP.NET Core, das keine dieser Garantien bietet.
  • ASP.NET Framework serialisiert und deserialisiert Objekte automatisch (sofern dies nicht im Speicher geschieht). ASP.NET Core bietet einen Mechanismus, um ein byte[] unter Angabe eines Schlüssels zu speichern. Die Serialisierung/Deserialisierung von Objekten muss von den Benutzer*innen manuell durchgeführt werden.

Die Adapterinfrastruktur macht zwei Schnittstellen verfügbar, die zur Implementierung eines beliebigen Sitzungsspeichersystems verwendet werden können. Diese lauten wie folgt:

  • Microsoft.AspNetCore.SystemWebAdapters.ISessionManager: Umfasst eine einzige Methode, an die ein HttpContext und die Sitzungsmetadaten übergeben werden, und die ein ISessionState-Objekt als Rückgabe erwartet.
  • Microsoft.AspNetCore.SystemWebAdapters.ISessionState: Beschreibt den Zustand eines Sitzungsobjekts. Dieser wird als Unterstützung für den Typ HttpSessionState verwendet.

Serialisierung

Da es die Adapter ermöglichen, mit stark typisierten Sitzungszuständen zu arbeiten, müssen wir in der Lage sein, Typen zu serialisieren und zu deserialisieren. Diese Anpassung erfolgt über Microsoft.AspNetCore.SystemWebAdapters.SessionState.Serialization.ISessionKeySerializer.

Es wird eine Standard-JSON-Implementierung bereitgestellt, die über die JsonSessionSerializerOptions konfiguriert wird:

  • RegisterKey<T>(string): Registriert einen Sitzungsschlüssel für einen bekannten Typ. Dies ist erforderlich, damit der Sitzungszustand ordnungsgemäß serialisiert/deserialisiert werden kann. Wenn ein Schlüssel gefunden wird, für den es keine Registrierung gibt, wird ein Fehler ausgelöst, und die Sitzung ist nicht verfügbar.
builder.Services.AddSystemWebAdapters()
    .AddJsonSessionSerializer(options =>
    {
        // Serialization/deserialization requires each session key to be registered to a type
        options.RegisterKey<int>("test-value");
    });

Implementierungen

Es gibt zwei Implementierungen des Sitzungszustandsobjekts, die derzeit ausgeliefert werden, jeweils mit einigen Abstrichen bei den Features. Die beste Wahl für eine App kann davon abhängen, in welcher Phase der Migration sie sich befindet, und kann sich im Laufe der Zeit ändern.

  • Stark typisiert: Bietet die Möglichkeit, auf ein Objekt zuzugreifen und kann in den erwarteten Typ umgewandelt werden.
  • Sperrung: Stellt sicher, dass mehrere Anforderungen innerhalb einer einzigen Sitzung in eine Warteschlange eingereiht werden und nicht gleichzeitig auf die Sitzung zugreifen.
  • Eigenständig: Verwenden Sie diese Option, wenn Sie keine Sitzungen zwischen ASP.NET Framework und ASP.NET Core freigeben, um Codeänderungen in Klassenbibliotheken zu vermeiden, die auf SessionState verweisen.

Im Folgenden werden die verfügbaren Implementierungen aufgeführt:

Implementierung Stark typisiert Sperren Eigenständig
Remote-App ✔️ ✔️
Umschlossener ASP.NET Core-Sitzungsstatus ✔️ ✔️