c# - 为什么Session变量会更新?

标签 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 在我只使用局部变量时会更新?

最佳答案

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

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

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

如果您希望以某种状态存储 session key 并继续编辑源对象而不影响存储的对象,则应将其序列化为 XML 或 JSON(或任何其他序列化格式)。请参阅 StackOverflow 上的其他问答:How to convert datatable to json string using json.net?

关于c# - 为什么Session变量会更新?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27818105/

相关文章:

asp.net - Visual Studio 2019 似乎没有看到我安装了 .NET Core 3.1(带 SDK)

用于 jpg 文件的 ASP.net MVC 3 路由

asp.net - .NET Core 应用程序是否需要在目标计算机上安装 .NET 运行时?

java - 我如何知道 Vaadin 7.x 中首次创建 session 的时间?

javascript - 如何检测浏览器窗口/选项卡关闭事件?

c# - 如何按名称引用 Windows 窗体控件 (C#/VB)

c# - 如何在 Windows 8 的 Web View 中捕获导航事件?

session - Tomcat8用户Memcached Config Session Share,但是无法启动,我用户Tomat7是对的

c# - 如何在 ASP.Net MVC 中使用 Task 重定向到一个 Action

c# - Json.Net 可以处理 List<object> 吗?