为什么Session变量会更新?

时间:2015-01-07 11:08:51

标签: c# asp.net session dataset

我一直在使用ExcelDataReader阅读xls文件,并将完整的DataTable放入Session变量中并附带以下代码

DataSet result = excelReader.AsDataSet(true,Convert.ToInt32(e.Parameter), 20);                
if (result.Tables.Count > 0)
   {                  
       if (result.Tables[0].Rows.Count > 0)
         {                       
            Session["CellDirData"] = result.Tables[0]; 
         }
   }

在其他一些功能中,我使用以下代码从DataTable变量中获取此Session

 DataTable dtTemp = (DataTable) Session["CellDirData"];                                   
 dtTemp.Rows.RemoveAt(0); // Removing first row from local variable dtTemp

当我从局部变量dtTemp中删除第一行时,它还会更新Session变量,即现在dtTempSession["CellDirData"]都有19行。

我的问题是为什么Session只在我使用局部变量时获得更新?

1 个答案:

答案 0 :(得分:2)

因为默认会话状态模式为InProc(正在进行中)。也就是说,您正在创建指向同一DataTable对象的引用,因为进程内也意味着内存中

或者换句话说:您的会话,类字段和局部变量共享相同的沙盒环境和内存,这意味着创建新的会话状态键几乎与声明新引用(类字段和局部变量)相同。

请参阅会话state modes article on MSDN,详细了解可用模式及其详细信息。

如果要在某种状态下存储会话密钥并继续编辑源对象而不影响存储的对象,则应将其序列化为XML或JSON(或任何其他序列化格式)。在StackOverflow上查看此其他Q& A:How to convert datatable to json string using json.net?