我们最近集成了ASP.Net Async SessionState Module,并开始在Global.asax Session_Start事件处理程序中看到空引用异常。
我无法在本地复制它,并且它似乎并非一直都在实时发生,但是我相信这是当我们尝试在Session_Start中访问HttpContext.Current时。我的猜测是HttpContext。Current有时为null,因为Session初始化是异步的。
关于地址的任何建议吗?
答案 0 :(得分:2)
也许答案太简单了,但我有时也会看到这种情况,建议您在Session_Start
事件中保护代码,例如
if (HttpContext.Current !== null)
{
// do your actions with the Current object
}
else
{
// possibly add some logging here to see what's going on
}
如果您发现这只是一个竞争条件,那么您的代码将做出正确的反应,而不仅仅是出现NullReferenceException。
在这种情况下,像这样保护它比在您引用它的任何地方添加Elvis运算符(?.
)更好,因为这将导致测试/故障排除的情况更加复杂。但是,在其他情况下,此运算符非常有用,例如在此different context.
此外,在the link you provided,中,我看到了提示“,要实现与Microsoft.AspNet.SessionState.SessionStateModule一起使用的自己的异步会话状态提供程序,您要做的就是实现一个具体的SessionStateStoreProviderAsyncBase类,已包含在Microsoft.AspNet.SessionState.SessionStateModule NuGet程序包中。”
也许您只需要实现该类而不是使用Session_Start-因为这里总是将HttpContext作为参数提供,而Session_Start只是为了向后兼容?