ASP.NET应用程序从会话中引发System.NullReferenceException。删除实现

ASP.NET应用程序从会话中引发System.NullReferenceException。删除实现,asp.net,session,nullreferenceexception,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 S

我们在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)
---> 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 
问题似乎来自Page.PageStatePersister属性,我们已经像这样覆盖了它

protected override PageStatePersister PageStatePersister {
  get {
    return new SessionPageStatePersister(Page); 
  }
}
Reflector显示SessionPageStatePersister在内部调用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.UI.SessionPageStatePersister.Save()
at System.Web.UI.Page.SaveAllState()
at System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
---> 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 
你知道是什么导致了这些异常吗

环境:


IIS6,Windows Server 2003 64位.net Framework 3.5

当同时处理同一用户(来自同一会话ID)发出的请求时,可能会出现此问题

这是因为删除条目时,
System.Web.SessionState.SessionStateItemCollection
不会检查该条目是否为空

System.Web.SessionState.SessionStateItemCollection.Remove(字符串名称)
方法中,在私有集合
\u serializedItems
上设置锁,以便移除操作是线程安全的。但是,此私有集合在添加操作期间不会被锁定。考虑到<>代码>序列化项表现为调整大小数组(当条目计数为其容量的1/2时,容量增加一倍,新条目填充空缺)。当集合中的空值仍然存在时,并发添加可能导致情况。 条目仅从
\u serializedItems
集合的[0;条目计数]范围中删除。删除条目时,其
属性将在不进行null检查的情况下被访问。因此,如果null条目从集合的中间被删除,
NullReferenceException
将被强制转换

默认情况下,除非将
System.Web.Configuration.PagesSection.EnableSessionState
显式设置为
ReadOnly
,否则将按顺序处理具有相同会话ID的所有请求。
在这种情况下,任何涉及将值添加到
System.Web.SessionState.HttpSessionState
(内部使用
System.Web.SessionState.HttpSessionStateContainer
,而内部使用
System.Web.SessionState.SessionStateItemCollection
)应该正确锁定以确保线程安全。

我还从NameObjectCollectionBase.BaseRemove(string)中获得了一个NullReferenceException,这似乎是在网站负载过重时发生的。这意味着某种竞争条件,但是看看该方法的代码,只有3个变量以可能触发NullReferenceException的方式使用,我看不出这些变量中有任何一个可能为null,所以这对我来说有点神秘。关于这个问题的任何发现,我们都面临着同样的问题