【问题标题】:.Net Shopping Cart Session accessible across different browsers by different users?.Net Shopping Cart Session 可以由不同的用户通过不同的浏览器访问吗?
【发布时间】:2011-12-01 01:35:25
【问题描述】:

使用以下方法创建购物车会话 http://net.tutsplus.com/tutorials/other/build-a-shopping-cart-in-aspnet/

现在在我的机器上本地运行,默认情况下会话状态模式为 inProc,一切似乎都运行良好。

我正在编写一个刚刚放在托管服务提供商(共享托管环境等)上的应用程序。他们的默认会话状态是 stateserver,所以我必须序列化这些类以适应它。它正在使用 cookie。

篮子(添加、删除等)工作正常,但我看到在会话的持久性方面发生了一些奇怪的事情。

在我的本地机器上,如果我在 2 个单独的浏览器中访问该站点,如果我在 IE 中添加项目,我可以在刷新时在 Firefox 中看到它们。这对我来说没有任何意义,因为 cookie 是每个浏览器的。

另外我认为当一个会话生成时,它的 id 是唯一的,所以一个用户不可能看到另一个用户的会话数据(除非可能在同一个浏览器中使用选项卡)

更糟糕的是,如果我开始在 IE 中添加/删除项目并在 Firefox 中这样做,那么每次刷新浏览器时它们都会显示非常随机的购物车结果。

有什么想法吗?我难住了!生成类和会话的代码几乎就是上面的链接。

【问题讨论】:

    标签: vb.net session random stateserver


    【解决方案1】:

    我没有详细介绍示例,但我会非常关注单例实现:

    public static readonly ShoppingCart Instance;
    

    由于这是一个 ASP.Net Web 应用程序,您将为每个连接到该网站的用户拥有一个购物车,而不是为每个用户会话创建一个实例。这显然不是一个好的设计。

    事实上,在 cmets 部分至少有一位用户问:“请告诉我如何创建新的购物车,而不是为所有用户使用同一个购物车。”

    我认为您最好按照以下方式进行:

    变化:

    public static readonly ShoppingCart Instance;  
    

    到:

    // Method to retrieve the current user's shopping cart, stored in their session
    public static ShoppingCart Instance() {
    
        ShoppingCart value;
    
        // If the cart is not in the session, create one and put it there  
    
        // Otherwise, get it from the session  
        if (HttpContext.Current.Session["ASPNETShoppingCart"] == null) {  
            value = new ShoppingCart();  
            value.Items = new List<CartItem>();  
            HttpContext.Current.Session["ASPNETShoppingCart"] = value;  
        } else {  
            value = (ShoppingCart)HttpContext.Current.Session["ASPNETShoppingCart"];  
        }  
        return value;
    }  
    

    然后完全删除静态构造函数。

    您必须在其余代码中进行的唯一更改是 ShoppingCart.Instance. 变为 ShoppingCart.Instance().

    【讨论】:

    • 谢谢老兄。我重新搜索了 cmets,发现其他人也遇到了同样的问题。您 100% 正确认为单例实现在会话中存储购物车信息时存在缺陷。
    • 非常感谢,这真的解决了整个问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多