Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Storing custom objects in Sessions

What the general way of storing custom objects in sessions?

I'm planning on keeping my cart in a session throughout the web application. When that user logs out, the session will be cleared.

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"]);         }     } } 

When the user signs in, I place the cart in a session, like:

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

But do I have to write Session["Cart"] on each and every page? Isn't there an easier way to do this? Also what about the Guest cart session? Where will I declare that?

I want each user session stored in a unique session, so that there's no mixing up between the guest session and the member session.

like image 297
user478636 Avatar asked Apr 13 '11 04:04

user478636


People also ask

Can we store object in session?

The Session object provides a dynamic, associative array into which you can store information. You can store scalar variables and object variables into the Session object. You can store user preferences in the Session object, and then access that preference to determine what page to return to the user.

Can we store object in session in C#?

It means you need persist your session in database at appropriate point. You may use out of process session storage (database or different server) - you have to mark your shopping cart class as serializable in such case. There is performance cost to out-of-process sessions.

How do I store a list in session?

Yes, you can store any object (I assume you are using ASP.NET with default settings, which is in-process session state): Session["test"] = myList; You should cast it back to the original type for use: var list = (List<int>)Session["test"]; // list.

What is the purpose of using session object?

You can use the Session object to store information needed for a particular user session. Variables stored in the Session object are not discarded when the user jumps between pages in the application; instead, these variables persist for the entire user session.


2 Answers

ASP.NET session corresponds to browser session - it is independent of whether user is authenticated (logged in) or not. So you should not have any issue with regards to guest/member sessions. I would advise you to expose the current shopping cart via static accessor property - for example

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  } 

Few things to consider here:

  1. Whenever web application or web server recycles/restarts, your in-process sessions would lost. It means you need persist your session in database at appropriate point.
  2. You may use out of process session storage (database or different server) - you have to mark your shopping cart class as serializable in such case. There is performance cost to out-of-process sessions. As such, you are already storing session in database, so IMO, you should use in-proc sessions making sure to write dirty sessions into the database as soon as possible.
like image 188
VinayC Avatar answered Oct 04 '22 08:10

VinayC


Add it to a master page or you could add a static property to you ShoppingCart object

public static ShoppingCart GetCurrent {     get     {         if(HTTPContext.Current.Session["CurrentCart"] == null)         {             HTTPContext.Current.Session["CurrentCart"] = new ShoppingCart();         }         return HTTPContext.Current.Session["CurrentCart"] as ShoppingCart;     } } 
like image 28
Dan Avatar answered Oct 04 '22 08:10

Dan