IHttpHandler中使用Session实现原理

简介:

正文

     在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的源代码。



本文转自over140 51CTO博客,原文链接:http://blog.51cto.com/over140/586469,如需转载请自行联系原作者

相关文章
|
消息中间件 SQL 存储
超详细的RabbitMQ入门,看这篇就够了!
RabbitMQ入门,看这篇就够了
219190 69
|
存储 缓存 算法
内存系列学习(四):Cache和Write Buffer一般性介绍
内存系列学习(四):Cache和Write Buffer一般性介绍
1013 0
|
7月前
|
开发者
(WEB CAD online )在线CAD实现圆孔标记功能
本文介绍了通过自定义实体 `McDbTestRoundHoleMark` 实现圆孔标记功能的方法。该功能支持多象限标记、可调节标记角度、多重标记及动态编辑,并自动计算包围盒以优化空间定位与选择操作。核心实现包括类结构定义、数据序列化、标记数据设置、夹点编辑及实体绘制等步骤。用户可通过插件初始化注册并创建圆孔标记,适用于工程图纸标注场景。在线Demo展示了实际效果,便于开发者参考与使用。
|
12月前
|
弹性计算 运维 Serverless
产品测评 | ECS的健康保障新助手——云服务诊断
本文评测了阿里云的云服务诊断工具,该工具旨在帮助运维工程师和开发者快速定位和解决云资源问题。工具提供了“健康状态”和“诊断”两大核心功能,能够实时监控云资源状态,排查如网站无法访问、ECS故障等多种问题,并给出修复建议。该工具显著提升了排障效率,但在文档清晰度、功能描述准确性及部分功能实现上仍有改进空间。总体而言,该工具值得推荐给其他用户或团队使用。
|
前端开发
如何在前端项目中单独引入 ElementUI 图标以及使用
这篇文章介绍了如何在前端项目中单独引入Element UI的图标文件以及如何使用这些图标。
1461 0
如何在前端项目中单独引入 ElementUI 图标以及使用
|
Android开发
Android 获取签名信息
Android 获取签名信息
469 0
|
安全 网络安全
允许Traceroute探测漏洞和ICMP timestamp请求响应漏洞解决方法(三)
允许Traceroute探测漏洞和ICMP timestamp请求响应漏洞解决方法(三)
2702 0
|
Java jenkins 测试技术
深入探讨软件测试技术:方法、工具与最佳实践
深入探讨软件测试技术:方法、工具与最佳实践
344 0
|
Kubernetes 容器
【kubernetes】使用 buildkit 构建镜像
【kubernetes】使用 buildkit 构建镜像
1334 1
【kubernetes】使用 buildkit 构建镜像
|
JavaScript
Vue中使用element-ui的el-dialog对话框,实现拖拽效果(整理)
Vue中使用element-ui的el-dialog对话框,实现拖拽效果(整理)