当前位置: 首页 > news >正文

IRequiresSessionState接口控制

原文链接:https://www.cnblogs.com/linxingxunyan/p/5782172.html

刚刚接触.net web端的朋友都会被Session坑过,莫名其妙的不能读取Session数据,后来知道原来有IRequiresSessionState这个接口,不继承的就不能读取Session里面的数据,知道这个以后呢,也不清楚里面具体是如何实现的。对此一直不甘心,于是查了各方面的资料终于模拟出来了。

  在一般处理程序(ashx文件)里面有个一个(HttpContext Context),F12进入HttpContext 类你面你会发现它应该是用了单例的模式,里面有个 public static HttpContext Current { get; set; },应该是确定程序只有一个上下文。接下来可以找到public HttpSessionState Session { get; },这就是我们需要读取Session。
废话少说,首先说明用到了反射。我们来介绍下Type 类中的Type IsAssignableFrom(Type c);方法。假设A类继承了B接口,  Type a = typeof(A);  Type b = typeof(B); 那么 a. IsAssignableFrom(b)的值为ture;这个可以判断类是否继承了IRequiresSessionState。这是第一步。
  第二步就是找到当前访问Session的类。这个就要用到StackTrace类,从名字上来看这个类是用来跟踪代码的。这里面要用到StackTrace 的GetFrame(index)方法和GetMethod(); 。GetFrame(index)这个是从调用的最里层往外层遍历,它的返回值也是StackTrace 。是GetMethod() 返回值是MethodBase,而MethodBase的ReflectedType属性可以得到当前类的Type。
  原理都在上面的,下面的代码是模拟过程。
using System;
using System.Diagnostics;
using System.Reflection;
using System.Web.SessionState;namespace Ztest
{public class Program: IRequiresSessionState{public static void Main(string[] args){try{if (Test.Current.session == null){Console.WriteLine("没有继承IRequiresSessionState");}else{Console.WriteLine(Test.Current.session);}}catch (Exception ex){}Console.ReadLine();}}public class Test{private  Test(){Type basetype = typeof(IRequiresSessionState);StackTrace trace = new StackTrace();int i = 0;Type type;while (true){///找到外层第一个调用类MethodBase methodName = trace.GetFrame(i).GetMethod();type = methodName.ReflectedType;if (type != typeof(Test)){break;}i++;}Boolean key = basetype.IsAssignableFrom(type);if (key){session = _m;}else{session = null;}}private static Test _Current;private string _m = "当前类实现了IRequiresSessionState";/// <summary>/// 模拟session/// </summary>public Object session { get; set; }public static Test Current{get{return get();}set{Current = value;}}private static Test get(){if (_Current == null){_Current = new Test();}return _Current;}}}

  

http://www.jsqmd.com/news/83452/

相关文章:

  • AI增强的模糊测试变异策略
  • tev:终极HDR图像查看器与专业对比工具指南
  • 2025混合机年度大盘点:二维/三维混合机咋选?混合机实力品牌生产商是哪家? - 品牌推荐大师1
  • 如何快速使用libimagequant:图像量化完整指南
  • 30亿参数撬动边缘智能革命:SmolLM3重新定义小模型商业价值
  • 监控选购全攻略:6大场景首选品牌,海康威视/格行视精灵各有侧重,小米性价比,萤石更全能;格行视精灵AOV技术+终生免流真好用?
  • 基于Spring Boot+MybatisPlus线上美食社区_17owxdug-java毕业设计
  • offline meta-RL | 近期工作速读记录
  • VASP入门指南:从零开始掌握材料计算核心技术
  • 解锁大脑奥秘:Yeo7与AAL90脑图谱的终极映射指南
  • 基于Spring Boot的仓储管理系统的设计与实现_yd8h4784-java毕业设计
  • 5步掌握Three.js延迟渲染技术:从多光源卡顿到流畅渲染的终极指南
  • LTspice中的齐纳二极管特性
  • 如何快速掌握Subnautica Nitrox:多人联机完整入门指南
  • Profinet转ModbusTCP网关:实现电池产线PLC与打标卡稳定通讯
  • OpenLayers三维地图实战:如何让建筑在地图上“站起来“?[特殊字符]
  • 基于YOLO11-SEG-AIFI的仪表指针位置识别与读取系统_1
  • React Native SVG开发实战:从图标到动画的完整解决方案
  • JavaScript-入门书-Primer--二-
  • 震惊!这家外卖小程序生产商竟让同行集体沉默
  • Profinet转ModbusTCP网关:实现西门子1200PLC与打标卡稳定通讯
  • 联想LJ2605D与LJ2655DN打印机实用维修指南
  • TUnit集成WireMock:构建稳定可靠的.NET测试体系
  • 通义万象Wan2.2:当想象遇见专业级AI视频生成
  • JavaScript-入门书-Primer--六-
  • 【毕业设计/课程设计】基于Python的热门微博数据可视化分析源码+论文+PPT+数据
  • 代码参数含义
  • Maddy邮件服务器终极配置指南:轻松搭建专业邮件系统
  • YOLOv5模型压缩终极指南:剪枝量化蒸馏完整实战
  • 材料的“温度计“:校平机如何读懂金属的“情绪“