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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 15:23:32