0

Session我的 .Net Webforms 项目中的对象有一些奇怪的(至少对我而言)功能。我正在传递对象Sessions并且我没有使用任何global变量。我有如下描述的方法:

 private int Foo()
 {
     RmRule ruleInEdit = (RmRule)Session["ruleInEdit"];
     //here ruleInEdit.subjectAreaID=0
     bool isValid = Validate();
     if (isValid)
     {
        //do some stuff
        //here ruleInEdit.subjectAreaID is 10 instead of 0
        //the Validate function modified the ruleInEdit object 
      }

    //other code
  }

   private bool Validate()
   {
       bool isValid;
       //check some stuff
       RmRule rule = (RmRule)Session["ruleInEdit"];
       rule.subjectAreaID = 10;
       Session["ruleInEdit"] = rule;
       return isValid;
    }

我认为 subjectAreaID 的值应该仍然是 0 但显然我误解了一些东西。ruleInEdit当我将对象写回.Net 时,.Net 如何(或为什么)自动更新对象Session

  • 在原始方法Foo中,我是否应该强制 ruleInEdit 再次读取会话以获取更新的对象和属性?
  • 由于我初始化它的方式,这个对象是否与会话范围相关联?
4

2 回答 2

5

您不必将对象写回会话集合,它永远不会离开。

该对象只有一个实例,当您从会话集合中读取它时,它不会被复制。您对对象所做的任何更改都会立即对查看同一实例(即同一会话)的所有代码可见。

会话集合中存储的只是对对象的引用。对象本身存储在堆上。

于 2012-08-22T19:22:09.720 回答
3

当您使用 InProc(默认情况下)会话存储时,不会发生序列化。您由您的自定义类操作,这是引用类型。因此,当您的方法 Validate 从会话中检索对象时,实际上它只是一个您正在更改原始对象的指针。换句话说,RmRule 类型的对象在 Foo 和 Validate 方法中是相同的。

例如,您所期望的行为将是在将应用程序设置切换为在 SQL 服务器中存储会话之后。

于 2012-08-22T19:28:29.950 回答