I was working on my MVC4 application with C#.NET framework 4.0 and I couldn’t hold a variable in a session. Why not?
Short answer: Never put a file you need to access from your web application in your ‘bin’ folder.
This question led me on quite a journey let me tell you. There are a vast multitude of answers possible to this question, so I will focus in this post on my own personal journey. Your session mode is very important, make sure you familiarize yourself with the different modes (http://msdn.microsoft.com/en-us/library/ms178586.aspx). I had it on the default mode which is InProc.
InProc can be dangerous in an operational environment because your session is stored in memory on the local webserver.
The memory associated with your web application is controlled by the AppDomain which is fired up when the first resource (such as a page) in an ASP.NET application is requested from the webserver. This AppDomain can be restarted for several reasons, here’s a list (and quite a nice extensive case study on the subject by Tess Ferrandez): http://blogs.msdn.com/b/tess/archive/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles.aspx
Have you read: “Why does an application domain recycle”? Look at bullet point number 2: “The bin directory or it’s content is modified”. The FCM (File Change monitor) appears to be quite jumpy, because all I have to do is access my XML file in the bin directory and the application domain is recycled, which causes the session to be born anew, which causes my session var to be non-existent (read: null).
If you have a situation like mine, put your XML file in the App_Data folder (where it belongs to be honest) and it’ll all run smoothly.