2013-10-29 116 views
2

我有一个对象封装一个System.Web.SessionState.HttpSessionState对象作为其数据成员之一。很少(我们无法准确再现何时或如何重现),我们将在访问customSession时遇到NullReferenceException错误.Session.SessionIDSessionID抛出空异常

我用调试器跟踪对象,而customSession.Session是不为空。这是一个有效的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 Studio的开发服务器中的一个错误?我只是不希望在生产版本上发生此问题,修复它的唯一方法是重新启动IIS。 -

其他信息:

我使用的是“打破时,公共语言运行时抛出异常”选项,所以发生了什么是系统试图访问CustomSession对象,cs.Session.SessionID和获取一个null-ref异常,然后调试器开始执行。然后,我使用watch窗口并在手表中放入“cs.Session”,它显示Session对象的所有属性,SessionID的行表示它会抛出一个空引用异常。如果没有手动处理,则此空引用异常会导致应用程序中断。

我能够通过重复修改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” 对象均为不null,这时每个的“Session”属性也不为空。

+0

何时调用此对象?这不太可能是卡西尼问题,而是当Session不可用时有时会调用Object。 – zimdanen

+0

是否[this](http://blogs.msdn.com/b/tess/archive/2006/08/02/asp-net-case-study-lost-session-variables-and-appdomain-recycles.aspx)帮帮我?它与IIS上应用程序域重新启动的条件有关,这将导致所有会话状态被删除。 – neeKo

+0

@NikoDrašković:听起来好像OP不会丢失* Session中的一个对象*就像失去* Session本身*一样。 – zimdanen

回答

-1

您正在观察通常由框架处理的异常。

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

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

+0

如果我没有打开异常抛出选项打开,应用程序完全崩溃时尝试访问会话ID。我可以选择确定错误发生的位置和原因。 :) –

+0

@CodeMonkey,发布导致异常的代码(例如,抛出异常时从调用堆栈中调用代码的最上面一行)。 – Ben

+0

我已将代码添加到主文章失败的位置(在注释中进行格式设置实际上并不能很好地工作) –