C# .Net更新会话对象的副作用
我在.NETWebForms项目中使用了一些奇怪的(至少对我来说)功能,包括C# .Net更新会话对象的副作用,c#,session,webforms,C#,Session,Webforms,我在.NETWebForms项目中使用了一些奇怪的(至少对我来说)功能,包括Session对象。我在会话中传递对象,并且没有使用任何全局变量。我的方法如下所述: private int Foo() { RmRule ruleInEdit = (RmRule)Session["ruleInEdit"]; //here ruleInEdit.subjectAreaID=0 bool isValid = Validate(); if (isValid)
Session
对象。我在会话中传递对象,并且没有使用任何全局变量。我的方法如下所述:
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,但显然我误解了什么。当我将对象写回会话时,.Net如何(或为什么)自动更新ruleInEdit
对象
- 在原始方法
Foo
中,我是否应该强制ruleInEdit再次读取会话以获取更新的对象和属性
- 这个对象与会话作用域绑定是因为我初始化它的方式吗李>
不必将对象写回会话集合,它永远不会离开
对象只有一个实例,从会话集合中读取时不会复制它。您对对象所做的任何更改都会立即对查看同一实例(即同一会话)的所有代码可见
会话集合中存储的只是对对象的引用。对象本身存储在堆上。使用InProc(默认)会话存储时,不会发生序列化。您正在通过自定义类执行操作,该类是引用类型。所以,当您的方法Validate从会话中检索对象时,实际上它只是一个指针,您正在更改原始对象。
换句话说,RmRule类型的对象在Foo和Validate方法中是相同的
例如,在将应用程序设置切换到SQL server中存储会话后,您可能会出现预期的行为。+0。未提及进程内/进程外差异。