Поделиться через


ASP.NET для миграции состояния добавочного сеанса ASP.NET Core

Состояние сеанса

Состояние сеанса в ASP платформа .NET Framework предоставляет ряд функций, которые ASP.NET Core не предоставляют. Чтобы обновить asp платформа .NET Framework на Core, адаптеры предоставляют механизмы для заполнения состояния сеанса аналогичным поведением, как System.Web это было. Ниже приведены некоторые различия между платформой и ядром:

  • ASP платформа .NET Framework будет блокировать использование сеансов в сеансе, поэтому последующие запросы в сеансе обрабатываются последовательно. Это отличается от ASP.NET Core, который не предоставляет никаких этих гарантий.
  • ASP платформа .NET Framework сериализует и десериализирует объекты автоматически (если не выполняется в памяти). ASP.NET Core предоставляет механизм хранения заданного byte[] ключа. Любая сериализация и десериализация объектов должна выполняться вручную пользователем.

Инфраструктура адаптера предоставляет два интерфейса, которые можно использовать для реализации любой системы хранения сеансов. К ним относятся:

  • Microsoft.AspNetCore.SystemWebAdapters.ISessionManager: этот метод имеет один метод, который передается HttpContext и метаданные сеанса, и ожидает ISessionState , что объект будет возвращен.
  • Microsoft.AspNetCore.SystemWebAdapters.ISessionState: описывается состояние объекта сеанса. Он используется в качестве резервной HttpSessionState копии типа.

Сериализация

Так как адаптеры обеспечивают возможность работы с строго типизированным состоянием сеанса, мы должны иметь возможность сериализации и десериализации типов. Это настраивается с помощью Microsoft.AspNetCore.SystemWebAdapters.SessionState.Serialization.ISessionKeySerializer.

Реализована реализация JSON по умолчанию, настроенная с помощью JsonSessionSerializerOptions:

  • RegisterKey<T>(string) — регистрирует ключ сеанса в известном типе. Это необходимо для правильной сериализации или десериализации состояния сеанса. Если ключ не найден, для нее отсутствует регистрация, будет возникать ошибка, и сеанс не будет доступен.
builder.Services.AddSystemWebAdapters()
    .AddJsonSessionSerializer(options =>
    {
        // Serialization/deserialization requires each session key to be registered to a type
        options.RegisterKey<int>("test-value");
    });

Реализации

Существует две доступные реализации объекта состояния сеанса, который в настоящее время отправляется, каждый из которых имеет некоторые компромиссы функций. Лучший выбор для приложения может зависеть от того, в какой части миграции она находится, и может измениться с течением времени.

  • Строго типизированный: предоставляет возможность доступа к объекту и может быть приведение к ожидаемому типу.
  • Блокировка. Гарантирует, что несколько запросов в одном сеансе помещаются в очередь и не обращаются к сеансу одновременно.
  • Автономный: используйте, если вы не используете сеанс обмена данными между ASP платформа .NET Framework и ASP.NET Core, чтобы избежать изменения кода в библиотеках классов, ссылающихся на SessionState.

Ниже приведены доступные реализации:

Внедрение Строго типизированный Блокировка Отдельные
Удаленное приложение ✔️ ✔️
Оболочка ASP.NET Core ✔️ ✔️