Compartir a través de


Migración de estado de sesión incremental de ASP.NET a ASP.NET Core

Estado de sesión

El estado de sesión de ASP.NET Framework proporcionó una serie de características que ASP.NET Core no proporciona. Para actualizar de ASP.NET Framework a Core, los adaptadores proporcionan mecanismos para habilitar el estado de sesión rellenado con un comportamiento similar al de System.Web. Algunas de las diferencias entre el Framework y Core son:

  • ASP.NET Framework bloquearía el uso de la sesión dentro de una sesión, por lo que las solicitudes posteriores de una sesión se controlan en serie. Esto es diferente de ASP.NET Core que no proporciona ninguna de estas garantías.
  • ASP.NET Framework serializaría y deserializaría los objetos automáticamente (a menos que se realice en la memoria). ASP.NET Core proporciona un mecanismo para almacenar una byte[] con una clave. El usuario debe realizar manualmente cualquier serialización o deserialización de objetos.

La infraestructura del adaptador expone dos interfaces que se pueden usar para implementar cualquier sistema de almacenamiento de sesión. Son las siguientes:

  • Microsoft.AspNetCore.SystemWebAdapters.ISessionManager: tiene un único método que se pasa por un HttpContext y los metadatos de sesión y espera que se devuelva un objeto ISessionState.
  • Microsoft.AspNetCore.SystemWebAdapters.ISessionState: describe el estado de un objeto de sesión. Se usa como respaldo del tipo HttpSessionState.

Serialización

Dado que los adaptadores proporcionan la capacidad de trabajar con un estado de sesión fuertemente tipado, debemos poder serializar y deserializar los tipos. Esto se personaliza a través de Microsoft.AspNetCore.SystemWebAdapters.SessionState.Serialization.ISessionKeySerializer.

Se proporciona una implementación ON predeterminada JSque se configura a través de JsonSessionSerializerOptions:

  • RegisterKey<T>(string) - Registra una clave de sesión en un tipo conocido. Esto es necesario para serializar o deserializar correctamente el estado de sesión. Si se encuentra una clave para la que no hay registro, se producirá un error y la sesión no estará disponible.
builder.Services.AddSystemWebAdapters()
    .AddJsonSessionSerializer(options =>
    {
        // Serialization/deserialization requires each session key to be registered to a type
        options.RegisterKey<int>("test-value");
    });

Implementaciones

Hay dos implementaciones disponibles del objeto de estado de sesión que se distribuye actualmente, cada una con algunas ventajas de las características. La mejor opción para una aplicación puede depender de la parte de la migración en la que se encuentra y puede cambiar con el tiempo.

  • Fuertemente tipado: proporciona la capacidad de acceder a un objeto y se puede convertir al tipo esperado
  • Bloqueo: garantiza que se ponen en cola varias solicitudes dentro de una sola sesión y no acceden a la sesión al mismo tiempo
  • Independiente: úselo cuando no comparta sesión entre ASP.NET Framework y ASP.NET Core para evitar modificar el código de las bibliotecas de clases que hace referencia a SessionState

A continuación se muestran las implementaciones disponibles:

Implementación Fuertemente tipado Bloqueo Independiente
Aplicación remota ✔️ ✔️
ASP.NET Core ajustado ✔️ ✔️