use*_*153 5 asp.net session nullreferenceexception
我们在ASP.NET Web应用程序中得到随机的System.NullReferenceException.我们正在使用inproc会话状态.堆栈跟踪:
System.NullReferenceException: Object reference not set to an instance of an object.
at System.Collections.Specialized.NameObjectCollectionBase.BaseRemove(String name)
at System.Web.SessionState.SessionStateItemCollection.Remove(String name)
at System.Web.SessionState.HttpSessionStateContainer.Remove(String name)
at System.Web.UI.SessionPageStatePersister.Save()
at System.Web.UI.Page.SaveAllState()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
Run Code Online (Sandbox Code Playgroud)
问题似乎来自Page.PageStatePersister属性,我们已经覆盖了这样的属性.
protected override PageStatePersister PageStatePersister {
get {
return new SessionPageStatePersister(Page);
}
}
Run Code Online (Sandbox Code Playgroud)
Reflector显示SessionPageStatePersister在内部调用Session.Remove.
我们在Page上直接调用Session.Remove时会得到类似的随机NullReferenceException.相关的堆栈跟踪:
---> System.NullReferenceException: Object reference not set to an instance of an object.
at System.Collections.Specialized.NameObjectCollectionBase.BaseRemove(String name)
at System.Web.SessionState.SessionStateItemCollection.Remove(String name)
at System.Web.SessionState.HttpSessionStateContainer.Remove(String name)
at System.Web.SessionState.HttpSessionState.Remove(String name)
at PERH.WebFramework.Bases.PageBase.OnPreInit(EventArgs e) in
Run Code Online (Sandbox Code Playgroud)
有什么想法,可能会导致那些异常吗?
环境:
IIS6,Windows Server 2003 64位,.net Framework 3.5
小智 2
当同时处理同一用户(来自同一会话 ID)发出的请求时,可能会出现此问题。
这是因为System.Web.SessionState.SessionStateItemCollection删除条目时不检查条目是否为空。
在该System.Web.SessionState.SessionStateItemCollection.Remove(string name)方法中,在私有集合上设置锁,_serializedItems以便删除操作是线程安全的。然而,这个私有集合在添加操作期间不会被锁定。考虑到其_serializedItems行为类似于调整大小的数组(当条目计数 >= 其容量的 1/2 时,容量将加倍,并且新条目将填充空值),并发添加可能会导致空值保留在集合中间的情况。这些条目仅从 [0; 中删除 条目计数] 集合的范围_serializedItems。删除条目时,Key无需进行 null 检查即可访问其属性。因此,如果集合中间的空条目被删除,则获取NullReferenceException强制转换。
默认情况下,除非System.Web.Configuration.PagesSection.EnableSessionState显式设置为,否则将按顺序处理具有相同会话 ID 的所有请求ReadOnly。在这种情况下,任何涉及添加值的操作System.Web.SessionState.HttpSessionState(内部使用System.Web.SessionState.HttpSessionStateContainer,内部使用System.Web.SessionState.SessionStateItemCollection)都应该被正确锁定,以确保线程安全。
| 归档时间: |
|
| 查看次数: |
1182 次 |
| 最近记录: |