zoukankan      html  css  js  c++  java
  • 在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,记得一定要实现这个接口哦。
     

  • 相关阅读:
    Scratch-Blockly配置过程
    Scratch www 系统搭建
    Scratch3.0——项目层次结构
    用canvas播放scratch文件
    Scratch3.0——克隆代码仓库的正确姿势
    Scratch3.0——作品截图
    Scratch GUI
    Ubuntu下Visual Studio Code的配置
    关于Ubuntu16.04下phpmyadmin出现mbstring错误的正解
    ubuntu搭建LAMP全教程及简单使用
  • 原文地址:https://www.cnblogs.com/yellowapplemylove/p/2021603.html
Copyright © 2011-2022 走看看