在ASP.NET中使用IHttpHandler处理请求(如自实现AJAX)时,无法获得Session(或者说是Session 为 null)的原因及解决方法
2011-04-07 20:32
1081 查看
先看这个帖子:
下面是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 事件。
引发 PostAuthenticateRequest 事件。
引发 AuthorizeRequest 事件。
引发 PostAuthorizeRequest 事件。
引发 ResolveRequestCache 事件。
引发 PostResolveRequestCache 事件。
根据所请求资源的文件扩展名(在应用程序的配置文件中映射),选择实现 IHttpHandler 的类,对请求进行处理。如果该请求针对从 Page类派生的对象(页),并且需要对该页进行编译,则 ASP.NET 会在创建该页的实例之前对其进行编译。
引发 PostMapRequestHandler 事件。
引发 AcquireRequestState 事件。
引发 PostAcquireRequestState 事件。
引发 PreRequestHandlerExecute 事件。
为该请求调用合适的 IHttpHandler 类的 ProcessRequest 方法(或异步版 BeginProcessRequest)。例如,如果该请求针对某页,则当前的页实例将处理该请求。
引发 PostRequestHandlerExecute 事件。
引发 ReleaseRequestState 事件。
引发 PostReleaseRequestState 事件。
如果定义了 Filter 属性,则执行响应筛选。
引发 UpdateRequestCache 事件。
引发 PostUpdateRequestCache 事件。
引发 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 处理程序需要对会话状态值具有读写访问权。这是一个标记接口,没有任何方法。
怎样在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 类的开发人员尤其需要注意这些事件。
对请求进行验证,将检查浏览器发送的信息,并确定其是否包含潜在恶意标记。有关更多信息,请参见 ValidateRequest 和脚本侵入概述。
如果已在 Web.config 文件的 UrlMappingsSection 节中配置了任何 URL,则执行 URL 映射。
引发 BeginRequest 事件。
引发 AuthenticateRequest 事件。
引发 PostAuthenticateRequest 事件。
引发 AuthorizeRequest 事件。
引发 PostAuthorizeRequest 事件。
引发 ResolveRequestCache 事件。
引发 PostResolveRequestCache 事件。
根据所请求资源的文件扩展名(在应用程序的配置文件中映射),选择实现 IHttpHandler 的类,对请求进行处理。如果该请求针对从 Page类派生的对象(页),并且需要对该页进行编译,则 ASP.NET 会在创建该页的实例之前对其进行编译。
引发 PostMapRequestHandler 事件。
引发 AcquireRequestState 事件。
引发 PostAcquireRequestState 事件。
引发 PreRequestHandlerExecute 事件。
为该请求调用合适的 IHttpHandler 类的 ProcessRequest 方法(或异步版 BeginProcessRequest)。例如,如果该请求针对某页,则当前的页实例将处理该请求。
引发 PostRequestHandlerExecute 事件。
引发 ReleaseRequestState 事件。
引发 PostReleaseRequestState 事件。
如果定义了 Filter 属性,则执行响应筛选。
引发 UpdateRequestCache 事件。
引发 PostUpdateRequestCache 事件。
引发 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 处理程序需要对会话状态值具有读写访问权。这是一个标记接口,没有任何方法。
相关文章推荐
- 【C#】对异步请求处理程序IHttpAsyncHandler的理解和分享一个易用性封装 【手记】走近科学之为什么明明实现了IEnumerable<T>的类型却不能调用LINQ扩展方法 【手记】手机网页弹出层后屏蔽底层的滑动响应 【手记】ASP.NET提示“未能创建类型”处理 【Web】一个非常简单的移动web消息框 【手记】解决EXCEL跑SQL遇“查询无法运行或数据库表无法打开...”
- 基于asp.net下使用jquery实现ajax的解决方法
- 工作中的问题解决 -- (win2003 asp.net) Session和带页面回传的方法无法正常使用解决方案
- 基于asp.net下使用jquery实现ajax的解决方法
- Win7的IIS配置asp.net出现“由于 Web 服务器上的“ISAPI 和 CGI 限制”列表设置,无法提供您请求的页面。”(图文解决方法)
- asp.net ajax 无法弹出alert对话框的解决方法
- ASP.NET MVC应用中浏览器无法发出Ajax请求的问题解决一例
- ASP.NET MVC使用Ajax的辅助的解决方法
- ASP.NET中使用AJAX后,Session丢失异常的自定义处理。
- asp.net updatepanel 导致JS不能加载,而无法使用的解决方法
- asp.net- ajax简单入门使用方法,通过一般处理程序ashx进行处理
- asp.net 使用cookies或者session实现浏览历史记录功能
- asp.net ajax 无法弹出alert对话框的解决方法
- ASP.NET在IIS上部署使用Oracle数据库无法连接数据库解决方法
- ASP.NET在IIS上部署使用Oracle数据库无法连接数据库解决方法
- asp.net updatepanel 导致JS不能加载,而无法使用的解决方法
- ASP.NET在IE10中无法判断用户已登入及Session丢失问题解决方法
- ASP.NET在IE10中无法判断用户已登入及Session丢失问题解决方法
- Asp.Net异常:"由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达式的值"的解决方法
- Ajax程序:处理异步调用中的异常(使用Asp.Net Ajax内建的异常处理方法)