前言

在实现自己的Handler的时候只需要继承IHttpHandler接口就行了,在Handler中使用Session时,只需要继承一下IRequiresSessionState就行了,到底为什么只需要实现一下接口就能使用Session了呢?下面和大家一起探讨一下。

工具

Reflector

正文

在Handler中使用Session的时候是从HttpContext中去取的,那么用Reflector直接去找到HttpContext,看他是如何做到的,把整个类用Reflector Disassembler出来,直接搜索关键字IRequiresSessionState,整个类里面只搜到一个,位置是1157行,下面我把代码一贴大家就明白了:

public IHttpHandler Handler
        {
            get
            {
                return this._handler;
            }
            set
            {
                this._handler = value;
                this.RequiresSessionState = false;
                this.ReadOnlySessionState = false;
                this.InAspCompatMode = false;
                if (this._handler != null)
                {
                    if (this._handler is IRequiresSessionState)
                    {
                        this.RequiresSessionState = true;
                    }
                    if (this._handler is IReadOnlySessionState)
                    {
                        this.ReadOnlySessionState = true;
                    }
                    Page page = this._handler as Page;
                    if ((page != null) && page.IsInAspCompatMode)
                    {
                        this.InAspCompatMode = true;
                    }
                }
            }
        }

代码说明:

1.     非常关键的代码 this._handler is IRequiresSessionState 和 this._handler is IReadOnlySessionState ,我们再看关于IRequiresSessionState的说明:指定目标 HTTP 处理程序需要对会话状态值具有读写访问权。而this.RequiresSessionState和this.ReadOnlySessionState默认都是false的,也就是说默认是不能访问Session的数据,当你继承IRequiresSessionState或IReadOnlySessionState之后访问权被打开!至于在哪里打开,有兴趣的朋友可以继续深究一下,在SessionStateModule这个类里面有更深入的答案,他是通过访问这个类的属性来判断是否需要打开Session的访问权的。

结束

写这篇文章的目的有两个:

1.     不明白的时候一定要问为什么,不仅如此还是努力尽所能的深究一下。

2.     学习一下这正模式,虽然不知道是哪条设计模式,但是如果是我的话我可能会写一个abstract来实现这样的功能。

友情提示:至于Handler的实现可以参考HttpApplication的源代码。

转之农民伯伯 IHttpHandler中使用Session实现原理[ASP.NET | IHttpHandler |IRequiresSessionState]的更多相关文章

  1. 在IHttpHandler中获取session

    因为业务要异步通过IHttpHandler获得数据,但还要根据当前登录人员的session过滤,因此要在在IHttpHandler中获取session 方法是HttpHandler容器中如果需要访问S ...

  2. PHP中的Session工作原理

    一直在使用session存储数据,一直没有好好总结一下session的使用方式以及其工作原理,今天在这里做一下梳理. 这里的介绍主要是基于php语言,其他的语言操作可能会有差别,但基本的原理不变. 1 ...

  3. HttpHandler中无法使用Session(context.Session 为Null)

    一.问题描述: 最近需要做一个对特定请求(.report)进行响应的接口,当然是使用实现IHttpHandler来进行处理,实现IHttpHandler接口就必须要实现它的两个方法,ProcessRe ...

  4. asp.net中一般处理程序中添加session

    asp.net中使用一般处理程序(.ashx)添加session,利用context.session["xxx"] = value的方式把值保存到session:运行的时候会出现该 ...

  5. c#中使用SESSION需要注意的几个问题

    C#的SESSION和其它程序中的SESSSION可能有一点的不同,下面讲下哪飞网程序员遇到的一个地方使用SESSION的问题.希望对大家有所帮助 一.在页面中用SESSION,存值session[& ...

  6. Asp.Net Web API中使用Session,Cache和Application的几个方法

    在ASP.NET中,Web Api的控制器类派生于ApiController,该类与ASP.NET的Control类没有直接关系,因此不能像在Web MVC中直接使用HttpContext,Cache ...

  7. Android快速入门(转自 农民伯伯: http://www.cnblogs.com/over140/)

    前言 这是前段时间用于公司Android入门培训的资料,学习Android三周时间收集整理的,时间仓促,希望能对像我这样还没入门就直接上项目的人一点帮助  :) 声明 欢迎转载,但请保留文章原始出处: ...

  8. ASP.NET中在一般处理程序中使用session的简单介绍

    这篇文章介绍了ASP.NET中在一般处理程序中使用session,有需要的朋友可以参考一下 <%@ WebHandler Language="C#" Class=" ...

  9. WebApi 中使用 Session

    1. 在 Global.asax.cs 文件中加入session支持 protected void Application_Start() { AreaRegistration.RegisterAll ...

随机推荐

  1. vs2005 ,2008,2010中引入app.manifest(即c#程序在win7下以管理员权限运行方法)

    打开VS2005.VS2008.VS2010工程,查看工程文件夹中的Properties文件夹下是否有app.manifest这个文件:如没有,按如下方式创建:鼠标右击工程在菜单中选择“属性”,点击工 ...

  2. 用vmware安装gho文件

    方法1:diskgenius+ghostexp 用vm新建一个空白硬盘虚拟机, 记住虚拟机文件的存储位置, 最好将默认的scsi硬盘移除另外新建ide的硬盘(否则可能开机蓝屏),然后用host机DIS ...

  3. java常用重构优化总结--自己亲身体验

    代码重构  6大原则:    单一职责原则(一个类最好最好只有一种行为动机,太多承担职责会导致耦合度太高).    开放封闭原则(功能可以扩展,但是不可以内部修改).    依赖倒转原则(应该依赖抽象 ...

  4. [并发编程]使用线程安全队列和条件变量的notify来安排分步骤任务

    // 方法1:直接构建N个THread来run foreach (i, size) { thread trd(&Instance::doWork, &inst); lstTrd.pus ...

  5. 存储过程实例总结(开发中的错误与总结,调试,数据库函数DATEDIFF计算当前日期是否在本周内)

    USE [POND] GO /****** Object: StoredProcedure [dbo].[OrderChargeList] Script Date: 04/16/2014 13:32: ...

  6. LINUX下mysql的大小写是否区分设置 转

    一.Linux中MySQL大小写详情:1.数据库名严格区分大小写2.表名严格区分大小写的3.表的别名严格区分大小写4.变量名严格区分大小写5.列名在所有的情况下均忽略大小写6.列的别名在所有的情况下均 ...

  7. 跟着百度学PHP[7]会话控制(session与cookie) 1.cookie的设置

    参考慕课网:http://www.imooc.com/learn/26 参考W3C:http://www.w3school.com.cn/php/php_cookies.asp setcookie() ...

  8. 新安装XAMPP,phpMyAdmin错误:#1045 - Access denied for user 'root'@'localhost' (using password: NO)

    错误如下: 打开D:\Program Files\xampp\phpMyAdmin(你的xampp的安装目录下的phpMyAdmin目录)目录下的config.inc.php文件 将 改为 然后,错误 ...

  9. eclipse+tomcat+httpServlet初学

    1.在eclipse中配置tomcat,参考上一边文章,建立的web项目tomcatWeb目录结构 2.添加Servlet处理类 3. 实现doGet()与doPost()方法: <span s ...

  10. centos防火墙操作

    centos防火墙基本操作 #/sbin/iptables -I INPUT -p tcp --dport 80 -j ACCEPT#/sbin/iptables -I INPUT -p tcp -- ...