.NET Core 6中HttpContext.Session.GetString始终返回Null问题
ASP.NET Core 6 Session 存列表后读取返回 null 的解决办法
1. 先确认 Startup 的 Session 配置是否正确
ConfigureServices 方法
必须添加 Session 服务,同时注入 IHttpContextAccessor 才能在业务服务中操作 Session;若序列化复杂对象,推荐配置 NewtonsoftJson 避免序列化问题:
public void ConfigureServices(IServiceCollection services) { // 配置 Session 过期时间与 Cookie 属性 services.AddSession(options => { options.IdleTimeout = TimeSpan.FromMinutes(30); options.Cookie.HttpOnly = true; options.Cookie.IsEssential = true; }); // 注入 HttpContextAccessor,用于在服务中获取 Session services.AddHttpContextAccessor(); // 配置 NewtonsoftJson 序列化(解决 System.Text.Json 的部分兼容性问题) services.AddControllersWithViews() .AddNewtonsoftJson(options => { options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore; }); // 注册你的仓储与服务 services.AddScoped<IUserRepository, UserRepository>(); services.AddScoped<UserService>(); }
Configure 方法
UseSession 的调用顺序必须正确,需放在 UseRouting 之后、UseAuthorization 之前:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler("/Home/Error"); app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); // 必须在此处添加 Session 中间件,顺序不能错 app.UseSession(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); }); }
2. 列表存入/读取 Session 的正确写法
Session 的 GetString 仅能读取字符串类型数据,列表属于对象类型,必须先序列化为 JSON 字符串存入,读取时再反序列化为对象:
UserService 示例代码
public class UserService { private readonly IHttpContextAccessor _httpContextAccessor; private readonly IUserRepository _userRepository; public UserService(IHttpContextAccessor httpContextAccessor, IUserRepository userRepository) { _httpContextAccessor = httpContextAccessor; _userRepository = userRepository; } // 将列表存入 Session public void SaveUserListToSession() { var userList = _userRepository.GetAllUsers(); // 序列化为 JSON 字符串 var userListJson = Newtonsoft.Json.JsonConvert.SerializeObject(userList); // 存入 Session _httpContextAccessor.HttpContext.Session.SetString("UserList", userListJson); } // 从 Session 读取列表 public List<User> GetUserListFromSession() { var userListJson = _httpContextAccessor.HttpContext.Session.GetString("UserList"); if (string.IsNullOrEmpty(userListJson)) { return new List<User>(); } // 反序列化为列表对象 return Newtonsoft.Json.JsonConvert.DeserializeObject<List<User>>(userListJson); } }
3. 常见错误排查点
- Session 中间件顺序错误:
UseSession若放在UseAuthorization之后或UseRouting之前,会导致 Session 无法正常读写。 - 未注入 IHttpContextAccessor:不在 Controller 中直接操作 Session时,必须注入该服务才能获取当前请求的 HttpContext。
- 直接存入对象未序列化:若直接通过扩展方法
Set("UserList", userList)存入对象,默认序列化可能失败,且GetString无法读取非字符串类型的数据。 - 键名拼写不一致:存入与读取的 Session 键名必须完全匹配(区分大小写)。
- Session 已过期:检查
IdleTimeout配置,若读取时已超过过期时间,Session 数据会被清空。
内容的提问来源于stack exchange,提问作者Shadouspan
相关产品推荐
相关产品推荐

