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

相关文章:

  • 30亿参数撬动边缘智能革命:SmolLM3重新定义小模型商业价值
  • offline meta-RL | 近期工作速读记录
  • 解锁大脑奥秘:Yeo7与AAL90脑图谱的终极映射指南
  • LTspice中的齐纳二极管特性
  • 基于Spring Boot的仓储管理系统的设计与实现_yd8h4784-java毕业设计
  • Profinet转ModbusTCP网关:实现电池产线PLC与打标卡稳定通讯
  • OpenLayers三维地图实战:如何让建筑在地图上“站起来“?[特殊字符]
  • 基于YOLO11-SEG-AIFI的仪表指针位置识别与读取系统_1
  • Profinet转ModbusTCP网关:实现西门子1200PLC与打标卡稳定通讯
  • TUnit集成WireMock:构建稳定可靠的.NET测试体系
  • Maddy邮件服务器终极配置指南:轻松搭建专业邮件系统
  • 如何保持家庭向上性
  • 材料的“温度计“:校平机如何读懂金属的“情绪“
  • 解锁B站跨区观看:BiliRoaming终极配置指南
  • 2025年想成为网络安全工程师?这是一条验证过的精通路径与避坑指南。
  • MacBook Touch Bar终极定制指南:三步打造高效工作空间
  • Signal-Android终极优化指南:7步实现APK大小缩减50%
  • JavaScript-入门书-Primer--四-
  • 终极指南:Windows平台FIO性能测试工具完整下载与安装教程
  • 通义万象Wan2.2:当想象遇见专业级AI视频生成
  • 实战指南:快速解决HtmlSanitizer依赖版本冲突问题
  • JMeter与专业压测平台:效率成本对比及主流平台推荐
  • 黑马头条-再回首
  • Citybound道路系统完整指南:5步掌握智能路网设计技巧
  • Whisper语音识别模型深度解析:从架构原理到实战应用
  • Livox-SDK2完整安装指南:快速配置激光雷达开发环境
  • MiMo-Audio:重新定义语音大模型的范式革命
  • 详细介绍:【设计模式手册008】适配器模式 - 让不兼容的接口协同工作
  • 告别繁琐配置:BMAD-METHOD如何实现AI开发环境的一键部署革命
  • 数学可视化终极指南:用动画让抽象数学触手可及