在Sessions中存储自定义对象

use*_*636 31 c# asp.net session

在会话中存储自定义对象的一般方法是什么.我打算在整个Web应用程序中保持我的购物车会话.当该用户注销时,会话将被清除.

Class ShoppingCart {
private List<CartItem> Items = new List<CartItem>();

    public ShoppingCart()
    {
            this.Items = new List<CartItem>();
            if (HttpCurrent.Current["Cart"]!=null])
            {
                this.Items = ShoppingCart.loadCart(HttpCurrent.Current["User"]);
            }

    }
}
Run Code Online (Sandbox Code Playgroud)

当用户登录时,我将购物车放在类似的会话中

Session["Cart"] = new ShoppingCart();
Run Code Online (Sandbox Code Playgroud)

但我是否必须在每一页上编写Session ["Cart"].有没有更简单的方法来做到这一点?还有Guest cart会话呢?我在哪里宣布?

我希望每个用户会话都存储在一个唯一的会话中.因此,在访客会话和成员会话之间没有任何混合.

Vin*_*ayC 39

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

Class ShoppingCart {

    public static ShoppingCart Current
    {
      get 
      {
         var cart = HttpContext.Current.Session["Cart"] as ShoppingCart;
         if (null == cart)
         {
            cart = new ShoppingCart();
            HttpContext.Current.Session["Cart"] = cart;
         }
         return cart;
      }
    }

... // rest of the code

}
Run Code Online (Sandbox Code Playgroud)

这里很少考虑的事情:

  1. 每当Web应用程序或Web服务器回收/重新启动时,您的进程内会话都将丢失.这意味着您需要在适当的时候在数据库中保持会话.
  2. 您可以使用进程外会话存储(数据库或不同服务器) - 在这种情况下,您必须将购物车类标记为可序列化.进程外会话有性能成本.因此,您已经在数据库中存储会话,所以IMO,您应该使用进程内会话,确保尽快将脏会话写入数据库.

  • @ user478636,这将取决于业务需求.如果用户在Web服务器重新启动的情况下丢失了购物车更改,这样可以吗?如果是,那么您可以采取措施,您将保存购物车定期说出或在退出时说.如果没有,那么您必须保存购物车每次更改,这是IMO真的是一个安全和更好的选择. (2认同)

Dan*_*Dan 5

将其添加到母版页,或者您可以将静态属性添加到 ShoppingCart 对象

public static ShoppingCart GetCurrent
{
    get
    {
        if(HTTPContext.Current.Session["CurrentCart"] == null)
        {
            HTTPContext.Current.Session["CurrentCart"] = new ShoppingCart();
        }
        return HTTPContext.Current.Session["CurrentCart"] as ShoppingCart;
    }
}
Run Code Online (Sandbox Code Playgroud)