`
guoyiqi
  • 浏览: 966496 次
社区版块
存档分类
最新评论

在ASP.NET中使用IHttpHandler处理请求(如自实现AJAX)时,无法获得Session(或者说是Session 为 null)的原因及解决方法

 
阅读更多

先看这个帖子:

怎样在HttpModule捕获到session?

http://topic.csdn.net/u/20070226/10/9db317e8-0400-4d92-9c93-83a90d6bcde5.html

下面是MSDN上的解释:

IIS 5.0 和 6.0 的 ASP.NET 应用程序生命周期概述

http://msdn.microsoft.com/zh-cn/library/ms178473(v=vs.80).aspx

在处理该请求时将由HttpApplication类执行以下事件。希望扩展HttpApplication类的开发人员尤其需要注意这些事件。

  1. 对请求进行验证,将检查浏览器发送的信息,并确定其是否包含潜在恶意标记。有关更多信息,请参见ValidateRequest脚本侵入概述

  2. 如果已在 Web.config 文件的UrlMappingsSection节中配置了任何 URL,则执行 URL 映射。

  3. 引发BeginRequest事件。

  4. 引发AuthenticateRequest事件。

  5. 引发PostAuthenticateRequest事件。

  6. 引发AuthorizeRequest事件。

  7. 引发PostAuthorizeRequest事件。

  8. 引发ResolveRequestCache事件。

  9. 引发PostResolveRequestCache事件。

  10. 根据所请求资源的文件扩展名(在应用程序的配置文件中映射),选择实现IHttpHandler的类,对请求进行处理。如果该请求针对从Page类派生的对象(页),并且需要对该页进行编译,则 ASP.NET 会在创建该页的实例之前对其进行编译。

  11. 引发PostMapRequestHandler事件。

  12. 引发AcquireRequestState事件。

  13. 引发PostAcquireRequestState事件。

  14. 引发PreRequestHandlerExecute事件。

  15. 为该请求调用合适的IHttpHandler类的ProcessRequest方法(或异步版BeginProcessRequest)。例如,如果该请求针对某页,则当前的页实例将处理该请求。

  16. 引发PostRequestHandlerExecute事件。

  17. 引发ReleaseRequestState事件。

  18. 引发PostReleaseRequestState事件。

  19. 如果定义了Filter属性,则执行响应筛选。

  20. 引发UpdateRequestCache事件。

  21. 引发PostUpdateRequestCache事件。

  22. 引发EndRequest事件。


在第10步就选择IHttpHandler,第12步生成HttpSessionState,第15步调用IHttpHandler类的ProcessRequest方法。也就是说在IHttpHandler类的ProcessRequest方法调用的时候HttpSessionState早就准备好了,但为什么得到的确实null呢?原因是没有给我们自己实现的这个IHttpHandler类显示地标明“我们要使用Session”!

解决方法是:

让你写的实现IHttpHandler接口的类再实现一个IRequiresSessionState接口,这个接口嘛,什么都没有,但是确实会让你的实现了IHttpHandler的类能得到一个非null的HttpSessionState!

来看一下IRequiresSessionState接口的描述:

http://msdn.microsoft.com/zh-cn/library/system.web.sessionstate.irequiressessionstate.aspx

指定目标 HTTP 处理程序需要对会话状态值具有读写访问权。这是一个标记接口,没有任何方法。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics