You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 19:43:29