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

.NET 4.8升级至.NET 6后Session用法失效,求.NET Core适配实现方案

问题原因

.NET 6 MVC 和 .NET Framework MVC 的 Session 实现有两个核心差异,直接导致原有代码失效:

  1. .NET 6 默认没有启用 Session 服务和中间件,所以会提示Session不存在
  2. .NET 6 的原生 Session 仅支持byte[]、int、string三种类型的存储,不支持直接存储/读取自定义类对象,必须手动做序列化/反序列化转换
实现步骤

1. 配置 Session 服务和中间件

修改项目根目录的Program.cs文件,按顺序添加 Session 相关配置:

var builder = WebApplication.CreateBuilder(args);

// 添加上下文访问器,支持在控制器外访问HttpContext
builder.Services.AddHttpContextAccessor();
// 注册Session服务,可自定义过期规则
builder.Services.AddSession(options =>
{
    options.IdleTimeout = TimeSpan.FromMinutes(30); // Session 过期时间
    options.Cookie.HttpOnly = true;
    options.Cookie.IsEssential = true;
});

// 保留原有服务注册逻辑,比如控制器视图注册
builder.Services.AddControllersWithViews();

var app = builder.Build();

// 原有中间件配置
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();

// 必须在路由之后、端点映射之前添加Session中间件
app.UseSession();

app.UseAuthorization();

app.MapControllerRoute(
    name: "default",
    pattern: "{controller=Home}/{action=Index}/{id?}");

app.Run();

2. 实现复杂对象读写的 Session 扩展方法

新增一个静态扩展类,封装序列化/反序列化逻辑,不用额外引入第三方包,直接用.NET自带的System.Text.Json即可:

using System.Text.Json;
using System.Text.Json.Serialization;
using Microsoft.AspNetCore.Http;

public static class SessionExtensions
{
    /// <summary>
    /// 存储复杂对象到Session
    /// </summary>
    public static void Set<T>(this ISession session, string key, T value)
    {
        session.SetString(key, JsonSerializer.Serialize(value, new JsonSerializerOptions
        {
            // 解决导航属性循环引用序列化问题
            ReferenceHandler = ReferenceHandler.IgnoreCycles
        }));
    }

    /// <summary>
    /// 从Session读取复杂对象
    /// </summary>
    public static T Get<T>(this ISession session, string key)
    {
        var value = session.GetString(key);
        return value == null ? default : JsonSerializer.Deserialize<T>(value);
    }
}

3. 替换原有Session读写代码

写入Session

// 控制器内直接用HttpContext即可
HttpContext.Session.Set<User>(Consts.CURRENTUSER, userFromDb);

读取Session

User _currentUser = HttpContext.Session.Get<User>(Consts.CURRENTUSER);
补充说明
  • 如果需要在控制器以外的服务类中使用Session,注入IHttpContextAccessor接口,通过_httpContextAccessor.HttpContext?.Session访问即可
  • 建议存储对象前清空不需要使用的导航属性,减少序列化开销和Session存储体积

内容的提问来源于stack exchange,提问作者Shlo

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.23 17:24:00