ASP.NET点击事件中反序列化Session购物车数据失败求助
问题原因分析
- 二次序列化导致格式错误:在
StoreCartData方法中,你将客户端传来的JSON字符串cartData1再次执行JsonConvert.SerializeObject,导致Session中存储的是JSON字符串的嵌套JSON表示(比如原始{"cart": [...]}被转义为"{\"cart\": [...]}"),这种格式无法直接反序列化为CartDataRequest对象,触发JsonSerializationException。 - 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
相关产品推荐
相关产品推荐

