我有一个对象,它将System.Web.SessionState.HttpSessionState对象封装为其数据成员之一。很少(以至于我们无法准确地在何时或如何重现),在访问NullReferenceException时,我们会得到这个对象的一个customSession.Session.SessionID错误。
我使用调试器来跟踪对象,customSession.Session不是null。它是一个有效的HttpSessionState对象。
Mode: InProc
StaticObjects: {System.Web.HttpStaticObjectsCollection}
SyncRoot: {System.Web.SessionState.HttpSessionStateContainer}
Keys: {System.Collection.SpecializedNameObjectCollectionBase.KeysCollection}
IsNewSession: true
IsReadOnly: false钥匙里面有4条记录。
但是,即使在调试器中,如果我探索这个对象并尝试获取SessionID,它也表示
"cs.Session.SessionID抛出了System.NullReferenceException类型的例外。
有人知道这是否只是Visual开发服务器中的一个bug吗?我只是不希望这个问题发生在生产发行版上,而解决这个问题的唯一方法就是重启IIS。
-编辑--
其他信息:
我使用的是“当公共语言运行时异常抛出时中断”选项,因此所发生的事情是系统试图访问CustomSession对象,如cs.Session.SessionID,并获得一个null-ref异常,调试器启动。然后我使用watch窗口并在手表中插入"cs.Session“,它显示了会话对象的所有属性,SessionID的行表示它抛出一个空引用异常。如果不手动处理,此空引用异常将导致应用程序中断。
我能够通过反复修改App_Code目录中的代码来重现错误(我认为大约进行了5或6个更改)。我不确定这是否是这个问题发生的唯一方式,因为这里的其他人在他们怀疑是会话超时之后报告了这个问题。在任何情况下,这种情况似乎都发生在"Session_End“事件的global.asax中。但是这个错误发生在"Session.Abandon()“语句被击中之前。
我已经确认我可以访问存储在会话中的值。唯一给出错误的是访问SessionID。
-附加(oct30)
发生错误的行是if-语句:
foreach (CustomSession cs in allSessions) {
if (cs.Session.SessionID == curSession.Session.SessionID) {
// do stuff
}
}"cs“和"curSession”对象都是null,此时每个对象的"Session“属性也不是null。
发布于 2013-10-29 20:56:20
您正在观察一个异常,它通常由框架来处理。
本质上,它是使用异常来实现每个连接的单例模式,以检测会话不存在的时间。因此,它只使用会话对象,如果抛出一个异常,它会当场创建一个异常并继续进行。
由于您选择了“抛出异常时的中断”,并且可能没有选择“只有我的代码”,所以它正在中断。因为是你要求的。
https://stackoverflow.com/questions/19668088
复制相似问题