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

ASP.NET点击事件中反序列化Session购物车数据失败求助

问题原因分析
  1. 二次序列化导致格式错误:在StoreCartData方法中,你将客户端传来的JSON字符串cartData1再次执行JsonConvert.SerializeObject,导致Session中存储的是JSON字符串的嵌套JSON表示(比如原始{"cart": [...]}被转义为"{\"cart\": [...]}"),这种格式无法直接反序列化为CartDataRequest对象,触发JsonSerializationException。
  2. WebMethod未启用Session支持:默认情况下,WebMethod不允许访问Session,若未显式启用,可能导致Session读写异常。
修复方案

方案1:直接存储原始JSON字符串(最简单)

修改StoreCartData方法,移除多余的序列化操作,同时启用Session支持:

public partial class PaymentForm : System.Web.UI.Page
{ 
    public class CartItem
    { 
        public string name { get; set; }
        public decimal price { get; set; }
        public int quantity { get; set; }
    }

    public class CartDataRequest
    {
        public List<CartItem> cart { get; set; }
        public decimal finalAmount { get; set; }
    }

    // 必须添加EnableSession=true启用Session访问权限
    [System.Web.Services.WebMethod(EnableSession = true)]
    public static void StoreCartData(string cartData1)
    {
        try
        {
            // 先验证传入JSON的有效性(可选,提前排查客户端传参问题)
            CartDataRequest cartData = JsonConvert.DeserializeObject<CartDataRequest>(cartData1);
            
            // 直接存储原始JSON字符串,无需二次序列化
            HttpContext.Current.Session["CartData"] = cartData1;

            System.Diagnostics.Debug.WriteLine("Cart data stored successfully in ASP session.");
            System.Diagnostics.Debug.WriteLine("CartData contents: " + HttpContext.Current.Session["CartData"]);     
        }
        catch (Exception ex)
        {
            System.Diagnostics.Debug.WriteLine("Error storing cart data: " + ex.Message);
            throw;
        }
    }
}

读取Session的代码无需修改,即可正常反序列化:

protected void btnSubmitOrder_Click(object sender, EventArgs e)
{
    try
    {
        string storedCartData = (string)Session["CartData"];
        System.Diagnostics.Debug.WriteLine("Stored Cart Data: " + storedCartData);

        if (!string.IsNullOrEmpty(storedCartData))
        {
            CartDataRequest cartData = JsonConvert.DeserializeObject<CartDataRequest>(storedCartData);
            System.Diagnostics.Debug.WriteLine("Final Amount: " + cartData.finalAmount);
            // 执行写入SQL的逻辑
        }
        else
        { 
            System.Diagnostics.Debug.WriteLine("Stored Cart Data is empty "); 
        }
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine("Error processing cart data: " + ex.Message);
        string script = "alert('An error occurred during the process')";
        ScriptManager.RegisterStartupScript(this, GetType(), "ServerControlScript", script, true);
    }
}

方案2:存储强类型对象(更安全)

如果希望Session中存储强类型对象,需先给实体类添加序列化特性:

[Serializable]
public class CartItem
{ 
    public string name { get; set; }
    public decimal price { get; set; }
    public int quantity { get; set; }
}

[Serializable]
public class CartDataRequest
{
    public List<CartItem> cart { get; set; }
    public decimal finalAmount { get; set; }
}

修改StoreCartData方法存储对象:

[System.Web.Services.WebMethod(EnableSession = true)]
public static void StoreCartData(string cartData1)
{
    try
    {
        CartDataRequest cartData = JsonConvert.DeserializeObject<CartDataRequest>(cartData1);
        // 直接存储强类型对象,ASP.NET会自动处理序列化
        HttpContext.Current.Session["CartData"] = cartData;

        System.Diagnostics.Debug.WriteLine("Cart data stored successfully in ASP session.");
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine("Error storing cart data: " + ex.Message);
        throw;
    }
}

读取时直接取出对象,无需反序列化:

protected void btnSubmitOrder_Click(object sender, EventArgs e)
{
    try
    {
        CartDataRequest cartData = Session["CartData"] as CartDataRequest;

        if (cartData != null)
        {
            System.Diagnostics.Debug.WriteLine("Final Amount: " + cartData.finalAmount);
            foreach (var item in cartData.cart)
            {
                System.Diagnostics.Debug.WriteLine($"Item: {item.name}, Price: {item.price}, Quantity: {item.quantity}");
            }
            // 执行写入SQL的逻辑
        }
        else
        {
            System.Diagnostics.Debug.WriteLine("Stored Cart Data is empty "); 
        }
    }
    catch (Exception ex)
    {
        System.Diagnostics.Debug.WriteLine("Error processing cart data: " + ex.Message);
        string script = "alert('An error occurred during the process')";
        ScriptManager.RegisterStartupScript(this, GetType(), "ServerControlScript", script, true);
    }
}

额外注意事项

  • 调试时可查看storedCartData的实际内容,若存在转义双引号,说明是二次序列化导致的问题,验证修复是否生效。
  • 确保项目中引用了正确版本的Newtonsoft.Json包。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 11:07:03