.NET Core 6.0中HttpContext Session存储UserRoleViewModel列表的问题
解决ASP.NET Core中Session存取复杂对象的问题
问题的核心是ASP.NET Core的ISession接口仅支持直接存储byte[]或简单类型(通过SetString/GetString等扩展方法),无法直接序列化/反序列化复杂对象(比如List<UserRoleViewModel>)。直接强转byte[]到列表会触发类型转换错误,set访问器也没有正确处理对象到byte[]的转换。
解决方案:实现Session对象序列化扩展方法
我们可以封装通用的扩展方法来处理对象的序列化和反序列化,推荐使用System.Text.Json(ASP.NET Core内置)或Newtonsoft.Json。
方式一:使用内置System.Text.Json
首先创建Session扩展类:
using System.Text.Json; using Microsoft.AspNetCore.Http; public static class SessionExtensions { // 将对象序列化后存入Session public static void SetObject<T>(this ISession session, string key, T value) { var json = JsonSerializer.Serialize(value); session.SetString(key, json); } // 从Session读取并反序列化为指定类型对象 public static T GetObject<T>(this ISession session, string key) { var json = session.GetString(key); return string.IsNullOrEmpty(json) ? default : JsonSerializer.Deserialize<T>(json); } }
然后修改你的属性:
public List<UserRoleViewModel> CurrentUserAssignedRoles { get { // 从Session读取并反序列化,为空则返回空列表 var roles = httpContextAccessor.HttpContext.Session.GetObject<List<UserRoleViewModel>>("CurrentUserAssignedRoles"); return roles ?? new List<UserRoleViewModel>(); } set { // 将列表序列化后存入Session httpContextAccessor.HttpContext.Session.SetObject("CurrentUserAssignedRoles", value); } }
方式二:使用Newtonsoft.Json(如果你偏好这个库)
先确保已安装Newtonsoft.Json NuGet包,然后创建扩展类:
using Newtonsoft.Json; using Microsoft.AspNetCore.Http; public static class SessionExtensions { public static void SetObject<T>(this ISession session, string key, T value) { var json = JsonConvert.SerializeObject(value); session.SetString(key, json); } public static T GetObject<T>(this ISession session, string key) { var json = session.GetString(key); return string.IsNullOrEmpty(json) ? default : JsonConvert.DeserializeObject<T>(json); } }
属性的修改和方式一完全一致。
关键注意事项
- 确保
UserRoleViewModel可序列化:类的属性需为公共访问级别,且存在公共无参构造函数(默认不手动定义构造函数时会自动生成);避免循环引用,否则序列化会失败。 - 空值处理:在
get访问器中判断反序列化结果是否为null,返回空列表而非null,避免后续使用时出现空引用异常。
内容的提问来源于stack exchange,提问作者Shadouspan
相关产品推荐
相关产品推荐

