Migration d’état de session d’ASP.NET à ASP.NET Core

État de la session

L’état de session dans ASP.NET Framework a fourni un certain nombre de fonctionnalités non fournie par ASP.NET Core. Pour mettre à jour ASP.NET Framework vers ASP.NET Core, les adaptateurs fournissent des mécanismes permettant de remplir l’état de session avec un comportement similaire à System.Web. Voici quelques-unes des différences entre ASP.NET Framework et le ASP.NET Core :

  • ASP.NET Framework verrouille l’utilisation de la session au sein d’une session, de sorte que les requêtes suivantes d’une session sont gérées en série. Ce fonctionnement est différent d’ASP.NET Core qui ne fournit aucune de ces garanties.
  • ASP.NET Framework sérialise, puis désérialise automatiquement les objets (sauf si cette action s’effectue en mémoire). ASP.NET Core fournit un mécanisme pour stocker un byte[] quand une clé est donnée. Toute sérialisation/désérialisation d’objet doit être effectuée manuellement par l’utilisateur.

L’infrastructure de l’adaptateur expose deux interfaces qui servent à implémenter n’importe quel système de stockage de session. Ces règles sont les suivantes :

  • Microsoft.AspNetCore.SystemWebAdapters.ISessionManager : contient une méthode unique qui obtient un HttpContext et les métadonnées de session ; elle s’attend à ce qu’un objet ISessionState soit renvoyé.
  • Microsoft.AspNetCore.SystemWebAdapters.ISessionState : décrit l’état d’un objet de session. Cette interface est utilisée comme soutien du type HttpSessionState.

Sérialisation

Puisque les adaptateurs permettent d’utiliser un état de session fortement typé, nous devons pouvoir sérialiser, puis désérialiser des types. La sérialisation et la désérialisation des types sont personnalisées via Microsoft.AspNetCore.SystemWebAdapters.SessionState.Serialization.ISessionKeySerializer.

Une implémentation JSON par défaut est fournie, puis configurée via les JsonSessionSerializerOptions :

  • RegisterKey<T>(string) : inscrit une clé de session dans un type connu. Cette action est nécessaire pour sérialiser/désérialiser correctement l’état de session. Si une clé pour laquelle il n’y a pas d’inscription est trouvée, une erreur est générée, puis la session n’est pas disponible.
builder.Services.AddSystemWebAdapters()
    .AddJsonSessionSerializer(options =>
    {
        // Serialization/deserialization requires each session key to be registered to a type
        options.RegisterKey<int>("test-value");
    });

Implémentations

Deux implémentations disponibles de l’objet d’état de session sont actuellement livrées, chacune avec des compromis de fonctionnalités. Le meilleur choix pour une application peut dépendre de la partie de la migration dans laquelle elle se trouve et peut changer au fil du temps.

  • Fortement typé : permet d’accéder à un objet et peut être casté dans le type attendu.
  • Verrouillage : garantit que plusieurs demandes au sein d’une même session sont mises en file d’attente et n’accèdent pas à la session en même temps.
  • Autonome : utilisez cette option lorsque vous ne partagez pas de session entre ASP.NET Framework et ASP.NET Core pour éviter de modifier le code dans les bibliothèques de classes qui fait référence à SessionState.

Voici les implémentations disponibles :

Implémentation Fortement typé Verrouillage Autonome
Application distante ✔️ ✔️
ASP.NET Core enveloppé ✔️ ✔️