Сеанс корзины покупок .Net доступен в разных браузерах для разных пользователей?

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

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

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

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

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

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

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

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


person user1074566    schedule 01.12.2011    source источник


Ответы (1)


Я не очень подробно рассматривал пример, но меня очень беспокоит реализация синглтона:

public static readonly ShoppingCart Instance;

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

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

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

Изменять:

public static readonly ShoppingCart Instance;  

to:

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

person competent_tech    schedule 01.12.2011
comment
Спасибо чувак. Я просмотрел комментарии и обнаружил, что другие столкнулись с той же проблемой. Вы на 100 % правы в том, что реализация singleton некорректна для целей хранения информации о корзине покупок в сеансе. - person user1074566; 01.12.2011
comment
большое спасибо, дорогая, это действительно решает всю проблему - person HAJJAJ; 15.06.2015