先看这个帖子:
怎样在HttpModule捕获到session?
http://topic.youkuaiyun.com/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类的开发人员尤其需要注意这些事件。
-
对请求进行验证,将检查浏览器发送的信息,并确定其是否包含潜在恶意标记。有关更多信息,请参见ValidateRequest和脚本侵入概述。
-
如果已在 Web.config 文件的UrlMappingsSection节中配置了任何 URL,则执行 URL 映射。
-
引发BeginRequest事件。
-
引发AuthenticateRequest事件。
-
引发AuthorizeRequest事件。
-
引发PostAuthorizeRequest事件。
-
引发ResolveRequestCache事件。
-
根据所请求资源的文件扩展名(在应用程序的配置文件中映射),选择实现IHttpHandler的类,对请求进行处理。如果该请求针对从Page类派生的对象(页),并且需要对该页进行编译,则 ASP.NET 会在创建该页的实例之前对其进行编译。
-
引发AcquireRequestState事件。
-
为该请求调用合适的IHttpHandler类的ProcessRequest方法(或异步版BeginProcessRequest)。例如,如果该请求针对某页,则当前的页实例将处理该请求。
-
引发ReleaseRequestState事件。
-
如果定义了Filter属性,则执行响应筛选。
-
引发UpdateRequestCache事件。
-
引发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 处理程序需要对会话状态值具有读写访问权。这是一个标记接口,没有任何方法。