ASP.NET 到 ASP.NET Core 增量会话状态迁移

会话状态

ASP.NET Framework 中的会话状态提供了许多 ASP.NET Core 不提供的功能。 为了从 ASP.NET Framework 更新到 Core,适配器提供了一些机制,可以使用与 System.Web 类似的行为填充会话状态。 框架和核心之间的一些差异包括:

  • ASP.NET 框架将锁定会话中的会话使用情况,因此会话中的后续请求以串行方式进行处理。 这与不提供任何这些保证的 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 进行自定义的。

提供通过 JsonSessionSerializerOptions 配置的默认 JSON 实现:

  • 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 ✔️ ✔️