IHttpHandler中使用Session实现原理[ASP.NET | IHttpHandler |IRequiresSessionState]

本文探讨了在ASP.NET中如何通过实现IRequiresSessionState接口来启用Handler中的Session访问权限。通过对HttpContext源代码的分析,揭示了访问权限开关的工作原理。

 

前言

     在实现自己的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.RequiresSessionStatethis.ReadOnlySessionState默认都是false的,也就是说默认是不能访问Session的数据,当你继承IRequiresSessionState或IReadOnlySessionState之后访问权被打开!至于在哪里打开,有兴趣的朋友可以继续深究一下,在SessionStateModule这个类里面有更深入的答案,他是通过访问这个类的属性来判断是否需要打开Session的访问权的。

 

结束

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

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

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

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

 

转载于:https://www.cnblogs.com/over140/archive/2008/12/27/1363491.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值