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