c# - 在 session 中存储自定义对象

标签 c# asp.net session

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

我计划在整个 Web 应用程序中将我的购物车保持在一个 session 中。当该用户注销时, session 将被清除。

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 中,例如:

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

但是我是否必须在每个页面上都写上Session["Cart"]?有没有更简单的方法来做到这一点?访客购物车 session 又如何呢?我将在哪里声明?

我希望每个用户 session 都存储在一个唯一的 session 中,以便访客 session 和成员(member) session 之间不会混淆。

最佳答案

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

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. 每当网络应用程序或网络服务器回收/重新启动时,您的进程内 session 就会丢失。这意味着您需要在适当的时候将您的 session 保存在数据库中。
  2. 您可以使用进程外 session 存储(数据库或不同的服务器)——在这种情况下,您必须将购物车类标记为可序列化。进程外 session 会产生性能成本。因此,您已经将 session 存储在数据库中,因此 IMO,您应该使用进程内 session ,确保尽快将脏 session 写入数据库。

关于c# - 在 session 中存储自定义对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5644304/

相关文章:

PHP json_encode 仅返回单行

具有自定义格式的 C# 通用 DateTime.ToString()

c# - FindAsync 很慢,但是延迟加载很快

c# - TableAdapter Fill 不更新数据库

iphone - 最适合移动 Web 的 ASP.NET Ajax 控件库

asp.net - 如何在 roleManager ASP.NET 中读取加密的连接字符串

asp.net - ASP.NET Web 应用程序中的文件读写

c# - 从 Main 方法/在 MonoDevelop 中运行 XUnit.Net 测试

Django 用户已注销

asp.net - session 变量在开发过程中的工作方式是否不同?