.NET 4.8升级至.NET 6后Session用法失效,求.NET Core适配实现方案
问题原因
.NET 6 MVC 和 .NET Framework MVC 的 Session 实现有两个核心差异,直接导致原有代码失效:
- .NET 6 默认没有启用 Session 服务和中间件,所以会提示
Session不存在 - .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
相关产品推荐
相关产品推荐

