在会话中存储自定义对象

在会话中存储自定义对象的一般方法是什么

我计划在整个web应用程序中保持购物车的会话状态。当该用户注销时,会话将被清除

类购物车
{
私有列表<CartItem>项目=新列表<CartItem>();
公共购物车()
{
this.Items=新列表<CartItem>();
if(HttpCurrent.Current[“购物车”!=null])
{
this.Items=ShoppingCart.loadCart(HttpCurrent.Current[“User”]);
}
}
}

当用户登录时,我将购物车置于会话中,如:

会话[“购物车”]=new ShoppingCart();

但是我必须在每一页上都写Session[“Cart”]?难道没有更简单的方法吗?客人购物车会议呢?我在哪里申报

我希望每个用户会话都存储在一个唯一的会话中,这样就不会混淆来宾会话和成员会话

ASP.NET会话对应于浏览器会话-它与用户是否经过身份验证(登录)无关。因此,对于来宾/会员会议,您不应该有任何问题。我建议您通过静态访问器属性公开当前购物车-例如

类购物车{
公共静态购物车当前
{
收到
{
var cart=HttpContext.Current.Session[“cart”]作为ShoppingCart;
if(null==购物车)
{
购物车=新购物车();
HttpContext.Current.Session[“Cart”]=Cart;
}
返回车;
}
}
…//代码的其余部分
}

这里很少考虑的事情:

  1. 每当web应用程序或web服务器回收/重新启动时,进程内会话就会丢失。这意味着您需要在适当的时间点将会话持久化到数据库中
  2. 您可以使用进程外会话存储(数据库或其他服务器)-在这种情况下,您必须将购物车类标记为可序列化。进程外会话会带来性能成本。同样地,您已经在数据库中存储了会话,所以在我看来,您应该使用in-proc会话,确保尽快将脏会话写入数据库

发表评论