Подтвердить что ты не робот

Хранение пользовательских объектов в сеансах

Каков общий способ хранения пользовательских объектов в сеансах. Я планирую держать свою корзину в сеансе во всем веб-приложении. Когда этот пользователь выйдет из системы, сеанс будет очищен.

Class ShoppingCart {
private List<CartItem> Items = new List<CartItem>();

    public ShoppingCart()
    {
            this.Items = new List<CartItem>();
            if (HttpCurrent.Current["Cart"]!=null])
            {
                this.Items = ShoppingCart.loadCart(HttpCurrent.Current["User"]);
            }

    }
}

Когда пользователь заходит, я помещаю корзину в сеанс как

Session["Cart"] = new ShoppingCart();

Но мне нужно написать Session [ "Корзина" ] на каждой странице. Разве нет более простого способа сделать это? Также как насчет сеанса гостевой телеграммы? Где я объявлю это?

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

4b9b3361

Ответ 1

Сегмент ASP.NET соответствует сеансу браузера - он не зависит от того, аутентифицирован ли пользователь (входит в систему) или нет. Поэтому у вас не должно быть никаких проблем в отношении гостевых/членских сессий. Я бы посоветовал вам разоблачить текущую корзину покупок через статическое свойство accessor - например

Class ShoppingCart {

    public static ShoppingCart Current
    {
      get 
      {
         var cart = HttpContext.Current.Session["Cart"] as ShoppingCart;
         if (null == cart)
         {
            cart = new ShoppingCart();
            HttpContext.Current.Session["Cart"] = cart;
         }
         return cart;
      }
    }

... // rest of the code

}

Несколько вещей, которые нужно рассмотреть здесь:

  • Всякий раз, когда веб-приложение или веб-сервер перерабатываются/перезапускаются, ваши сеансы в процессе работы теряются. Это означает, что вам нужно сохранить свою сессию в базе данных в соответствующей точке.
  • Вы можете использовать хранилище сеансов процессов (база данных или другой сервер) - в этом случае вы должны пометить свой класс корзины покупок как сериализуемый. Стоимость выполнения внепроцессных сеансов. Таким образом, вы уже храните сеанс в базе данных, поэтому IMO, вы должны использовать in-proc сессии, чтобы как можно скорее написать грязные сессии в базу данных.

Ответ 2

Добавьте его на главную страницу или вы можете добавить статическое свойство к объекту ShoppingCart

public static ShoppingCart GetCurrent
{
    get
    {
        if(HTTPContext.Current.Session["CurrentCart"] == null)
        {
            HTTPContext.Current.Session["CurrentCart"] = new ShoppingCart();
        }
        return HTTPContext.Current.Session["CurrentCart"] as ShoppingCart;
    }
}