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

我计划在整个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"]);
        }
    }
}

当用户登录时,我将购物车放入会话中,如下所示:

Session["Cart"] = new ShoppingCart();

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

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

推荐答案

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

}

这里要考虑的几件事:

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

Asp.net相关问答推荐

ASP.NET MVC forEach 循环仅返回 1 个值

Swashbuckle 通过 .NET 应用程序中的 XML 注释使用格式标识符

如何在 MVC 中为国家和州/省创建 Select 列表

无法加载文件或程序集.无效指针(HRESULT 异常:0x80004003 (E_POINTER))

IE10 SCRIPT5009:__doPostBack未定义

ASP.NET 平台是否有与 Heroku 等价的工具?

尽管安装了 AspNetCoreModule,但在 IIS 中运行 ASP.NET Core 应用程序时出现 0x8007000d 错误 500.19

如何从 SQL Server 2008 本身获取客户端 IP 地址?

使用 Asp.Net MVC 和 Web Api 配置 Ninject

我的 asp.net mvc Web 应用程序中的 OutputCache 设置.防止缓存的多种语法

有条件地排除 ASP.NET WebForms 中的一个 html 块

ASP.NET MVC 2.0 JsonRequestBehavior 全局设置

回发不适用于 aspx 页面作为默认文档

ServiceStack 示例应该以什么顺序被理解?

System.Reflection.Assembly.LoadFile 锁定文件

如何在 GridView 中隐藏 TemplateField 列

C# - 将图像输出到响应输出流给出 GDI+ 错误

在 ASP.NET Web API 2 中禁用 *all* 异常处理(为我自己腾出空间)?

以编程方式滚动到锚标记

Page.IsPostBack 和 Page.IsCallBack 有什么区别?