当前位置: 首页 > 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.gsyq.cn/news/93637.html

相关文章:

  • AI增强的模糊测试变异策略
  • tev:终极HDR图像查看器与专业对比工具指南
  • 监控选购全攻略:6大场景首选品牌,海康威视/格行视精灵各有侧重,小米性价比,萤石更全能;格行视精灵AOV技术+终生免流真好用?
  • VASP入门指南:从零开始掌握材料计算核心技术
  • 5步掌握Three.js延迟渲染技术:从多光源卡顿到流畅渲染的终极指南
  • 如何快速掌握Subnautica Nitrox:多人联机完整入门指南
  • 联想LJ2605D与LJ2655DN打印机实用维修指南
  • 震惊!这家外卖小程序生产商竟让同行集体沉默
  • 代码参数含义
  • Unity XR交互工具包示例:10个实用功能全面解析
  • 更新后的数据保存到数据库之后,为什么还要保存到Redis中?
  • JavaScript高级:深入对象与内置构造函数
  • JavaScript-入门书-Primer--五-
  • 那个让我熬夜三天的bug,原来OrcaSlicer编译还能这样玩!
  • 突破视频压缩瓶颈:Kvazaar开源HEVC编码器深度解析
  • 2025企业级大模型新标杆:Qwen3-235B-A22B-Instruct-2507深度解析
  • MCAO造模后血脑屏障被破坏的时间
  • AGENTS.md:为AI编程助手打造的开放规范指南
  • AI伦理播客探讨算法与科技社会影响
  • 基于KL-ISODATA算法的电力负荷数据场景聚类matlab仿真
  • AI元人文构想: 解剖学术僵尸与范式革命
  • OpenVoice语音克隆完整教程:中文转英文发音的简单步骤
  • vue-virtual-scroller的使用,展示巨量数据,长列表优化,虚拟列表
  • 产品经理技术赋能指南:跨越沟通鸿沟的专业手册
  • LMCache完整指南:如何让长上下文LLM推理快10倍、便宜10倍
  • 2025年终盘点:台式高速冷冻离心机优质供应商/厂家推荐top5 - 品牌推荐大师
  • AI视觉评分神器:5分钟搞定图片质量优化,让转化率提升19%
  • Hugo Academic CV:3分钟打造专业学术简历的终极指南
  • Snowy-Cloud微服务架构终极指南:从零构建企业级开发平台的10个核心技巧
  • 企业级低代码开发框架终极指南:JeeLowCode快速上手教程