【问题标题】:Session_Start and ASP.Net Async SessionState ModuleSession_Start 和 ASP.Net 异步 SessionState 模块
【发布时间】:2019-05-01 04:32:05
【问题描述】:

我们最近集成了 ASP.Net Async SessionState Module,并开始在 Global.asax Session_Start 事件处理程序中看到 null ref 异常。

我无法在本地复制它,而且它似乎不会一直发生在现场,但我相信这是我们尝试在 Session_Start 中访问 HttpContext.Current 的时候。我的猜测是 HttpContext.Current 有时为 null,因为 Session 初始化是异步的。

关于如何解决的任何建议?

【问题讨论】:

  • 你实现了自己的SessionStateStoreProviderAsyncBase吗?如果是这样,您可以发布一些代码吗?此外,这个包看起来适用于 HttpContextBase,而不是 HttpContext
  • @user326608 不,我们使用了问题中链接的模块

标签: asp.net-mvc session-state global-asax httpcontext


【解决方案1】:

也许答案太简单了,但我也时常看到这种情况,我建议你在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 只是为了向后兼容?

【讨论】:

  • 是的,这就是我所做的。不幸的是,我们需要 HttpContext 来执行一些业务逻辑
  • 在您提供的链接中,我看到了提示 “要实现您自己的与 Microsoft.AspNet.SessionState.SessionStateModule 一起使用的异步会话状态提供程序,您需要做的就是实现一个具体的SessionStateStoreProviderAsyncBase 类,它包含在 Microsoft.AspNet.SessionState.SessionStateModule NuGet 包中。” - 只是猜测:也许您只需要实现该类而不是使用 Session_Start - 因为这里总是一个 HttpContext 作为参数和Session_Start 只是为了向后兼容?
  • 有趣的想法。这可能值得探索。我去看看
猜你喜欢
  • 1970-01-01
  • 2016-12-21
  • 1970-01-01
  • 2013-08-15
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2023-03-07
  • 2013-08-28
相关资源
最近更新 更多