Доступна ли сессия .Net Shopping Cart для разных браузеров разными пользователями? - PullRequest
1 голос
/ 01 декабря 2011

Использование следующего метода для создания сеанса корзины покупок http://net.tutsplus.com/tutorials/other/build-a-shopping-cart-in-aspnet/

Теперь выполняется локально на моем компьютере, где по умолчанию установлен режим сеанса inProc. Кажется, все работает нормально.

Я пишу приложение, которое я только что разместил на хостинг-провайдере (среда общего хостинга и т. Д.). Их сессионное состояние по умолчанию - stateserver, поэтому мне пришлось сериализовать классы, чтобы соответствовать этому. Он использует куки.

Корзина (добавление, удаление и т. Д.) Работает нормально, но я наблюдаю некоторые странные вещи, связанные с продолжительностью сеанса.

На моем локальном компьютере, если я получаю доступ к сайту в 2 отдельных браузерах, если я добавляю элементы в IE, я могу видеть их в Firefox при обновлении. Это не имеет никакого смысла для меня, так как куки для браузера.

Кроме того, я подумал, что при создании сеанса его идентификатор будет уникальным, поэтому один пользователь не сможет увидеть данные сеанса другого пользователя (если, возможно, он не вставлен в тот же браузер)

Еще хуже, если я начну добавлять / удалять элементы в IE и делать то же самое в Firefox, оба они будут показывать очень случайные результаты корзины при каждом обновлении браузера.

Есть идеи? Я в тупике! Код для генерации класса и сеанса в значительной степени совпадает с приведенной выше ссылкой.

1 Ответ

1 голос
/ 01 декабря 2011

Я не прошел детальную проработку примера, но я был бы весьма обеспокоен реализацией синглтона:

public static readonly ShoppingCart Instance;

Поскольку это веб-приложение ASP.Net, у вас будетодна корзина покупок для каждого отдельного пользователя, который подключается к веб-сайту, в отличие от одного экземпляра для каждого сеанса пользователя.Это явно не хороший дизайн.

На самом деле, в разделе комментариев есть по крайней мере один пользователь, который спросил: «Пожалуйста, скажите мне, как создать новую корзину, а не использовать одну и ту же корзину для всех пользователей».

Я думаю, что вам было бы лучше что-то вроде этого:

Изменить:

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...