尽管有一个IRequireSessionState / IReadOnlySessionState处理程序,ASP.NET会话仍为NULL?

时间:2009-10-19 12:02:27

标签: asp.net session

在调查another problem时,我遇到了一种奇怪的情况。

在Global.asax方法中,我有以下代码:

protected void Application_AcquireRequestState(object sender, EventArgs e)
{
    if (!(Context.Handler is IRequiresSessionState || Context.Handler is IReadOnlySessionState)) // No session - no validation.
        return;
    DoSomething();
}

DoSomething()方法调用会抛出一个NullReferenceException,这很简单,只有当HttpContext.Current.Session为空时,才能做到这一点。

这怎么可能?

2 个答案:

答案 0 :(得分:1)

那时HttpContext.Current.Session可能为空。该事件在会话 获取的时间点开始,无法保证此时获取。您可能挂钩此事件的一个原因是因为您提供了一个自定义模块来实现您自己的Session对象。在这里,这样的自定义模块将设置会话。

如果要使用Session对象,则应使用PostAquireRequestState事件。

答案 1 :(得分:0)

在此方法中,尚未构造Session对象,因此无法访问它。尝试在此方法之后执行的任何方法中执行此操作。也许 Application_PreRequestHandlerExecute或查看此页面以查看global.asax文件中方法的执行顺序 https://web.archive.org/web/1/http://articles.techrepublic%2ecom%2ecom/5100-10878_11-5771721.html

其余事件处理应用程序请求,并按以下顺序触发:

* Application_BeginRequest
* Application_AuthenticateRequest
* Application_AuthorizeRequest
* Application_ResolveRequestCache
* Application_AcquireRequestState
* Application_PreRequestHandlerExecute
* Application_PreSendRequestHeaders
* Application_PreSendRequestContent
* <<code is executed>>
* Application_PostRequestHandlerExecute
* Application_ReleaseRequestState
* Application_UpdateRequestCache
* Application_EndRequest