1

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

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

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

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

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

另外,我认为生成会话时,它的 id 将是唯一的,因此一个用户不可能看到另一个用户的会话数据(除非可能在同一个浏览器中添加标签)

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

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

4

1 回答 1

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

于 2011-12-01T02:46:16.560 回答