加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > asp.Net > 正文

ASP.NET应用程序从Session.Remove实现中抛出System.NullReferenc

发布时间:2020-12-16 03:15:37 所属栏目:asp.Net 来源:网络整理
导读:我们在ASP.NET Web应用程序中得到随机的System.NullReferenceException. 我们正在使用inproc会话状态. 堆栈跟踪: System.NullReferenceException: Object reference not set to an instance of an object.at System.Collections.Specialized.NameObjectColl
我们在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)

问题似乎来自Page.PageStatePersister属性,我们已经覆盖了这样的属性.

protected override PageStatePersister PageStatePersister {
  get {
    return new SessionPageStatePersister(Page); 
  }
}

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

有什么想法,可能会导致那些异常吗?

环境:

IIS6,Windows Server 2003 64位,.net Framework 3.5

解决方法

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

这是因为System.Web.SessionState.SessionStateItemCollection在删除条目时不会将该条目检查为null.

在System.Web.SessionState.SessionStateItemCollection.Remove(字符串名称)方法中,在私有集合_serializedItems上设置锁定,以便Remove操作是线程安全的.然而,在Add操作期间,此私有集合不会被锁定.考虑到_serializedItems表现为一个调整大小的数组(当条目数量>> =其容量的1/2时,容量加倍,新条目填充空值)并发添加可能导致空值保留在集合中间的情况.
这些条目仅从[0; entries count] _serializedItems集合的范围.删除条目时,访问其Key属性而不进行空检查.因此,如果删除集合中间的空条目,则会抛出NullReferenceException.

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读