在httpHandler中访问Session

在httpHandler中访问Session
最近在做HttpHandler时发现不能访问Session,HttpContext.Current.Session的值为null。在Page页中访问时提示
只有在配置文件或 Page 指令中将 enableSessionState 设置为 true 时,才能使用会话状态。还请确保在应用程序配置的 <configuration>\<system.web>\<httpModules> 节中包括 System.Web.SessionStateMod 或自定义会话状态模块。
而按照提示在web.config中加入正确的配置节后错误依然存在。

经过仔细分析和上网查找,发现如果没有aspx文件直接继承自dll中的类,那么在访问这个Page类时,Dll无法共享应用程序中的Session对象。
比如在web.config中添加httphandler
<add verb="*" path="Admin/Login.aspx" type="**.Login,**"/>
这里的**.Login继承自System.Web.UI.Page,也就是说可以说成**.Login是一个Page的Codebehind.
因为Page类继承了接口IHttpHandler 所以这里可以直接用Page类做Handler处理。
如果在**.Login中访问 Session["Admin"] = 1;就会出现上面提示的错误。

另一种方式是类直接继承自接口IHttpHandler,在这种方式下添加HttpHanler后,访问Session是依然会出现如上的错误提示。

解决的方法其实很简单,就是同时继承IHttpHandler和IRequiresSessionState。

如下代码:

第一种方式:
    public class AdminLogin : Page, IRequiresSessionState
    {    .... }
第二种方式:
   public class AdminLogin : IHttpHanlder, IRequiresSessionState
   { ... }

IRequiresSessionState接口并不需要我们实现其详细的代码。使用这种方式时不需要在web.config中另行指定enableSessionState和在httpmodule中添加session处理对象(否则会提示错误)。

如果我们存在一个aspx页面,页面继承自dll中的Page类,如下形式:
<%@ Page Language="C#" Inherits="**.Test"%>
那么在**.Test类中不需要继承接口 IRequiresSessionState.
这是因为通过aspx页访问时,asp.net已经传递了页面的httpcontext给**.Test,所以此时不再需要继承IRequiresSessionState的接口。

以上内容为原创,欢迎转载,转载请注明出处。
作者:含苞


HttpHandler获得Session值失败问题解决方法
   通常我们经常,通过session判定用户是否登录。还有一些临时的、重要的数据也尝尝存放在Session中。

在页面我们很容易的得到Session的值,但在类中就会遇到一些问题。也知道通过下面的方法得到。

System.Web.HttpContext.Current.Session["userinfo"];

   但是今天此种方法也失灵了。在做一个小应用时,需要实现IHttpHandler,同时也需要用到用户的标识。但是在这个类中怎么也不能找到Session的值,曝出

System.Web.HttpContext.Current.Session为null

  为什么得到的Session会是空呢?想了好久也没想通。找了好久,才找到了高人的指点,问题得到了解决。

解决方法:

  在实现IHttpHandler的同时,也要实现IRequiresSessionState接口,其命名空间为:System.Web.SessionState。

public class WatermarkHandler : IHttpHandler, System.Web.SessionState.IRequiresSessionState{}

继续追踪:

  为什么要实现这个接口呢?这个接口是做什么用的呢?继续追踪,MSDN给了最终解释。

  IRequiresSessionState

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

  作用:

在自定义 HTTP 处理程序中实现 IRequiresSessionState 接口,以确定处理程序是否需要对会话状态值具有读写访问权
  所以记得哦,如果在自定义HTTP处理程序中,要访问Session,记得一定要实现这个接口哦。
 

你可能感兴趣的:(session)