2

我有一个将 System.Web.SessionState.HttpSessionState 对象封装为其数据成员之一的对象。在访问 customSession.Session.SessionID 时,很少(以至于我们无法准确地重现何时或如何)我们会收到与此对象有关的 NullReferenceException 错误

我已经使用调试器来跟踪对象,并且customSession.Session不为空。它是一个有效的HttpSessionState对象。

Mode: InProc

StaticObjects: {System.Web.HttpStaticObjectsCollection}

SyncRoot: {System.Web.SessionState.HttpSessionStateContainer}

Keys: {System.Collection.SpecializedNameObjectCollectionBase.KeysCollection}

IsNewSession: true

IsReadOnly: false

Keys 中有 4 条记录。

但即使在调试器中,如果我探索对象并尝试获取 SessionID,它会说

“cs.Session.SessionID 引发了 System.NullReferenceException 类型的异常。

有谁知道这是否只是 Visual Studio 开发服务器中的一个错误?我只是不想在生产版本上出现这个问题,解决它的唯一方法是重新启动 IIS。

- 编辑 -

附加信息:

我正在使用“抛出公共语言运行时异常时中断”选项,所以发生的情况是系统试图访问 CustomSession 对象,如 cs.Session.SessionID 并获得空引用异常,并且调试器启动. 然后我使用监视窗口并在监视中输入“cs.Session”,它显示了 Session 对象的所有属性,并且 SessionID 的行说它抛出了一个空引用异常。如果不手动处理,此 null ref 异常会导致应用程序中断。

通过反复修改 App_Code 目录中的代码,我能够重现该错误(我认为大约进行了 5 或 6 次更改)。我不确定这是否是此问题发生的唯一方式,因为这里的其他人报告说,这是在他们怀疑会话超时之后发生的。无论如何,它似乎发生在来自 global.asax 的“Session_End”事件中。但是错误发生在“Session.Abandon()”语句被命中之前。

我已经确认我可以访问存储在会话中的值。唯一给出错误的是访问 SessionID。

--- 附加 (oct30) ----

发生错误的行是 if 语句:

foreach (CustomSession cs in allSessions) {
    if (cs.Session.SessionID == curSession.Session.SessionID) {
        // do stuff
    }
}

“cs”和“curSession”对象都不为空,此时每个对象的“Session”属性也不为空。

4

1 回答 1

-1

您正在观看一个通常由框架处理的异常。

本质上,它使用异常来实现每个连接的单例模式,以检测会话何时不存在。所以它只使用会话对象,如果抛出异常,它会在现场创建一个并继续。

由于您选择了“抛出异常时中断”并且可能没有选择“仅我的代码”,因此它正在中断。因为你要求它。

于 2013-10-29T20:56:20.667 回答