ASP.NET Core 8.0中Session不存在于当前上下文的错误求助
ASP.NET Core 8.0 解决Session不存在于当前上下文的问题
你遇到的The name session does not exist in the current context错误,是因为ASP.NET Core和传统ASP.NET的Session使用逻辑完全不同,不能直接通过Session属性访问,需要完成以下配置和代码修改:
1. 先在Program.cs中配置Session中间件
ASP.NET Core需要先注册Session服务并启用中间件,才能正常使用会话功能:
注册Session服务
在builder.Build()之前添加Session服务配置:
builder.Services.AddSession(options => { options.IdleTimeout = TimeSpan.FromMinutes(30); // 自定义会话超时时间 options.Cookie.HttpOnly = true; // 禁止前端JS访问会话Cookie,提升安全性 options.Cookie.IsEssential = true; // 标记Cookie为必要,符合隐私合规要求 });
启用Session中间件
在中间件管道中,必须将UseSession()放在UseRouting之后、UseAuthorization和UseEndpoints之前:
app.UseSession();
2. 修改控制器中的Session访问逻辑
ASP.NET Core的ISession不支持直接存储复杂对象(比如List<CartVM>),需要先序列化为JSON字符串,读取时再反序列化。同时要通过HttpContext.Session访问会话,而非直接调用Session:
修改后的CartPartial方法
public IActionResult CartPartial() { CartVM model = new CartVM(); int qty = 0; decimal price = 0; // 从Session读取购物车的JSON字符串 var cartJson = HttpContext.Session.GetString("cart"); if (!string.IsNullOrEmpty(cartJson)) { // 反序列化为CartVM列表 var cartList = JsonSerializer.Deserialize<List<CartVM>>(cartJson); foreach (var item in cartList) { // 空值处理,避免NullReferenceException qty += item.Quantity ?? 0; price += item.Price ?? 0m; } model.Quantity = qty; model.Price = price; } else { model.Quantity = 0; model.Price = 0m; } return PartialView(model); }
补充:添加商品到购物车的Session存储逻辑
当需要将商品加入购物车时,同样要通过序列化方式存储:
public IActionResult AddToCart(int productId) { // 读取现有购物车列表 var cartJson = HttpContext.Session.GetString("cart"); List<CartVM> cartList = string.IsNullOrEmpty(cartJson) ? new List<CartVM>() : JsonSerializer.Deserialize<List<CartVM>>(cartJson); // 示例:从数据库获取商品信息(实际项目替换为真实查询逻辑) var product = new CartVM { Id = productId, NamePrd = "示例商品", Quantity = 1, Price = 99.9m, PrdImage = "product.jpg" }; // 更新购物车项:存在则加数量,不存在则添加新项 var existingItem = cartList.FirstOrDefault(x => x.Id == productId); if (existingItem != null) { existingItem.Quantity += 1; } else { cartList.Add(product); } // 序列化后存回Session HttpContext.Session.SetString("cart", JsonSerializer.Serialize(cartList)); return RedirectToAction("CartPartial"); }
关键注意点
- 中间件顺序不能错:
UseSession必须在路由之后、端点之前配置,否则无法正常访问Session - 复杂对象必须序列化:
ISession仅支持存储字符串、字节数组等简单类型,自定义类必须转为JSON格式存储 - 空值处理:你的
CartVM属性均为可空类型,计算时要通过??处理空值,避免空引用错误
内容的提问来源于stack exchange,提问作者Rezo
相关产品推荐
相关产品推荐

