One is InProc where you store the data in the same system memory and the other one is OutProc where the memory will be stored in some other way like State Server or SQL Server. And there are many considerations while using OutProc in this mode we can store classes which serializable only. And most of the things in .NET like DataView, DataRow are not Serializable and cannot be placed in Session in this Mode
Introduction
To Support Non Serailzable type in ASP.NET OutProc Session Mode we need to find an alternate solutions for it. One of the solution is convert that Non Serializable class into a class to Serializable and if the class is not in your control you can implement the below logic.
Say for example you are using a Page in ASP.NET which store some data in session below is the sample that you can use to allow views on this page. If you want to make it applicable to all Pages you just need to put these methods in Global.asax
Code
Place the below code on Page Init / Load
for (int i = 0; i < Session.Keys.Count; i++)
{
if (Session[Session.Keys[i]] is DataTable)
{
if (Session[Session.Keys[i] + "_isView"] != null)
{
DataTable current = (DataTable)Session[Session.Keys[i]];
string[] dataViewOptions = Session[Session.Keys[i] + "_isView"].ToString().Split('|');
string rowFilter = dataViewOptions[0];
DataViewRowState rowState = (DataViewRowState)Enum.Parse(typeof(DataViewRowState), dataViewOptions[1]);
string sort = dataViewOptions[2];
Session[Session.Keys[i]] = new DataView(current, rowFilter, sort, rowState);
Session[Session.Keys[i] + "_isView"] = null;
}
}
}
Place the below code on Unload
for (int i = 0; i < Session.Keys.Count; i++)
{
if (Session[Session.Keys[i]] is DataView)
{
DataView current = (DataView)Session[Session.Keys[i]];
Session[Session.Keys[i]] = current.Table;
Session[Session.Keys[i] + "_isView"] = current.RowFilter + "|" + current.RowStateFilter.ToString() + "|" + current.Sort;
}
}
Conclusion
You can similarly use the same methods for other Non Serializable types like DataRows etc… This type of logic is very helpful if you don't have access to the classes to modify or make it Serializable. The basic rule is to store the Session Objects in a way that can be retried back