为什么会话变量得到更新?

Why Session variable gets update?

我一直在使用 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]; 
         }
   }

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

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

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

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

因为默认 session 状态模式是 InProc (in-process)。也就是说,您正在创建指向相同 DataTable object 的引用,因为 in-process 也意味着 in-memory

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

请参阅 session state modes article on MSDN 以了解有关可用模式及其详细信息的更多信息。

如果您想以某种状态存储 session 密钥并继续编辑源 object 而不影响存储的密钥,您应该 序列化 它到 XML 或 JSON(或任何其他序列化格式)。在 Whosebug 上查看其他问答:How to convert datatable to json string using json.net?