.Net购物车会话可由不同用户在不同浏览器上访问?

时间:2011-12-01 01:35:26

标签: vb.net session random stateserver

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

现在我的机器本地运行,默认情况下sessionstate模式是inProc,所有似乎都运行良好。

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

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

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

另外我认为在生成会话时,其id将是唯一的,因此一个用户无法看到其他会话数据(除非在相同的浏览器中标记)

更糟糕的是,如果我开始在IE中添加/删除项目并在Firefox中执行此操作,则每次刷新浏览器时都会显示非常随机的购物车结果。

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

1 个答案:

答案 0 :(得分:1)

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

public static readonly ShoppingCart Instance;

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

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

我认为你会因为这些方面的事情而变得更好:

变化:

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().