我在会话中存储了一个购物车,当用户点击购买时,它会减少存储在数据库中的商品数量。
如果用户在付款之前关闭浏览器,我想将这些数量返回数据库。
我在global.asax中的void Session_End(object sender,EventArgs e)事件中执行此操作,但项目数量没有增加。我在web.config中将会话超时设置为1分钟,会话确实已经结束,因为如果我坐在那里有一个完整的购物车,它会在一分钟后变空,但数据库中的数量不会更新。
这是我在session_end中的代码
void Session_End(object sender, EventArgs e)
{
if (ShoppingCart.Instance.Items.Count == 0)
return;
foreach (var cartItem in ShoppingCart.Instance.Items.OfType<CartItemGeneric>())
{
var stock = thisModel.EshopItems.Where(i => i.Id == cartItem.Item.Id).First();
stock.SapQuantity += cartItem.Quantity;
thisModel.SaveChanges();
}
}
答案 0 :(得分:0)
您的问题可能是因为会话状态可能在会话结束事件中不可用。如何在ShoppingCart.Instance
访问器中引用会话状态?在结束请求时,不一定会触发会话结束事件,因此您可能没有有效的HttpContext来获取会话状态。
无论如何,Session_End事件是实现您想要做的事情的不可靠方式。例如,对于进程外会话,不会引发该事件。如果托管您的Web应用程序的应用程序域崩溃,您的库存数据会发生什么变化?更好的解决方案是仅在购买商品时标记您的库存数量(而不是在商品添加到购物车时)。