Session的模拟

Session相关的mock

Session相关的mock主要有以下两个步骤:

1) HttpContext对象的实例化

² session属于HttpContext对象,所以简单来说,就是我们需要构造一个HttpContext,对象然后在给其中的Session附值。然后再把它指定到 System.Web.HttpContext.Current 中

² MSDN里HttpContext构造函数是公开的,

 

名称

说明

clip_image001

HttpContext(HttpWorkerRequest)

使用指定的辅助请求对象初始化 HttpContext 类的新实例。

模拟的代码如下:

clip_image003

但是需要注意的是,如果我们再简单的增加下面一行,虽然编译没有错误,但是执行不通过。

System.Web.HttpContext.Current.Session["Test"] = 8888;

因为SimpleWorkerRequest并没有封装有关Session的功能。

http://msdn.microsoft.com/zh-cn/library/system.web.hosting.simpleworkerrequest

这样我们还需要模拟session。

2) 模拟session的对象

² Session是HttpSessionState 类型,要mock session,必须要自行创建HttpSessionState。那接下来首先想到的是用HttpSessionState的构造函数来创建。

² 在MSDN上查看HttpSessionState类,

http://msdn.microsoft.com/zh-cn/library/system.web.sessionstate.httpsessionstate_members(v=VS.80).aspx

发现公开成员和受保护成员均无构造函数。

² 去代码里看HttpSessionState元数据,也没有找到构造函数。这就很为难了。

² 上网查找得知,可以用“.NET Reflector”这个工具查明。

.NET Reflector 是一个只有 548 KB 的.net 类浏览工具。

它可以读取存储在 .net 应用程序 中的 metadata、IL 指令、资源和XML文档。

并可以把这些信息,以IL、C#、VB.net 、Delphi、MC++、Chrome 这些语言的方式来展示其中的功能.

分析如何用Mock对象,就是借用了这个工具,分析出了HttpSessionState类构造函数的具体接口,进而可以用反射方式构造出HttpSessionState类的实例。

 

使用方法:这软件以前都是免费的,如今竟然收费了。。。

可耻的是,收费后还通知老版本在2011年5月左右会失效,不自动升级时无法使用的。。。。。

但是办法还是有的,只要把系统时间改为2011年5月之前就可以使用咯~

一般都改为2010年就可以了

² 继续上网搜索,发现有人已经把HttpSessionState类直接Reflector出来了,那就直接看成果吧

.net 2.0 下 HttpSessionState 的构造函数变成了下面方式:

internal HttpSessionState(IHttpSessionState container)

{

this._container = container;

}

这样我们首先要实现一个 IHttpSessionState 接口的对象。

² 查找MSDN可知,

接口

说明

IHttpSessionState

定义协定以实现自定义会话状态容器。

这个IHttpSessionState接口可以实现自定义session。

创建一个类实现这个接口即可。

IHttpSessionState接口的属性如下

名称

说明

CodePage

获取或设置当前会话的代码页标识符。

CookieMode

获取一个值,该值指示是否为无 Cookie 会话配置应用程序。

Count

获取会话状态项集合中的项数。

IsCookieless

获取一个值,该值指示会话 ID 是嵌入在 URL 中还是存储在 HTTP Cookie 中。

IsNewSession

获取一个值,该值指示会话是否是与当前请求一起创建的。

IsReadOnly

获取一个值,该值指示会话是否为只读。

IsSynchronized

获取一个值,该值指示对会话状态值的集合的访问是否是同步(线程安全)的。

Item[Int32]

按数字索引获取或设置会话状态项的值。

Item[String]

按名称获取或设置会话状态项值。

Keys

获取存储在会话状态项集合中的所有值的键的集合。

LCID

获取或设置当前会话的区域设置标识符 (LCID)。

Mode

获取当前会话状态模式。

SessionID

获取会话的唯一会话标识符。

StaticObjects

获取由 ASP.NET 应用程序文件 Global.asax 中的 <object Runat="Server" Scope="Session"/> 标记声明的对象的集合。

SyncRoot

获取一个对象,该对象可用于同步对会话状态值的集合的访问。

Timeout

获取并设置在会话状态提供程序终止会话之前各请求之间所允许的超时期限(以分钟为单位)。

IHttpSessionState接口的方法如下

名称

说明

Abandon

结束当前会话。

Add

向会话状态集合添加一个新项。

Clear

从会话状态项集合中清除所有值。

CopyTo

将会话状态项值的集合复制到一维数组中(从数组的指定索引处开始)。

GetEnumerator

返回一个枚举数,可用来读取当前会话中所有会话状态项值。

Remove

删除会话状态项集合中的某个项。

RemoveAll

从会话状态项集合中清除所有值。

RemoveAt

删除会话状态项集合中指定索引处的项。

可以借用这个接口的范例代码,以下形式来实现这个接口

public sealed class MySessionState : IHttpSessionState

{……}

详细内容请看代码。

http://msdn2.microsoft.com/zh-cn/library/system.web.sessionstate.ihttpsessionstate.aspx

² 由于HttpSessionState的构造函数是internal类型的,要调到它必须通过反射了。

clip_image005

3) HttpContext对象补足

² 结合上述两点,HttpContext对象和session对象都有了。

那如何在HttpContext对象加入session对象呢?

简单的赋值是没用的,因为属性session是只读的。

² 通过.NET Reflector可以得知,HttpContext对象里有如下信息

clip_image007

那么很明显,在HttpContext对象的Item[“AspSession”]里把session对象放入即可。

这是一个很隐蔽的信息。

² 把包含session信息的HttpContext对象赋给HttpContext.Current即可以模拟session成功了

HttpContext.Current = HttpContext对象;

转载于:https://www.cnblogs.com/warioland/archive/2011/09/26/2191289.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/261225.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

定时自动启动任务crontab命令用法

原创作品&#xff0c;允许转载&#xff0c;转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://navyaijm.blog.51cto.com/4647068/816636 crontab简介 crontab命令常见于Unix和类Unix的操作系统之中&#xff0c;用于设置周期性被执行的…

9读书1-我在义务发财(1)

母亲说完&#xff0c;父亲就起身出门了。我没出门&#xff0c;上楼到了我的房间里。我要干两件事情&#xff1a;一是写“发财”两个大字贴在我的床头&#xff1b;二是在手上刺青。 //有时候为了达到自己心中说想打目标&#xff0c;必须时时刻刻的提醒自己&#xff0c;这就是一些…

java忽略引号中的分隔符_java – 令牌化但忽略引号内的分隔符

在这种情况下,使用java.util.regex.Matcher更容易使用find()而不是任何类型的拆分.也就是说,不必定义令牌之间的分隔符的模式,您可以为令牌本身定义模式.以下是一个例子&#xff1a;String text "1 2 \"333 4\" 55 6 \"77\" 8 999";// 1 2 &quo…

【转】Tomcat+MyEclipse

TomcatMyEclipse 单位&#xff1a;河南恩湃电力技术有限公司 部门&#xff1a;IT部—应用集成项目组 编写&#xff1a;刘志华 日期&#xff1a;2010-4-19 说明 本文中要讲述在程序开发过程中Tomcat和MyEclipse的一些使用方法和常用配置&#xff0c;本文适用于公司内部所有使用T…

学生管理系统(C语言)

1 #include <stdio.h>2 #include <stdlib.h>3 #include <string.h>4 #define N 35 #define LEN (Student*) malloc(sizeof(Student))6 /* 学生数据结构 */7 typedef struct node8 {9 char num[20];10 char name[15];11 int score[N];12 int …

linux java usb 串口_2019-11-02 Linux下USB-串口的使用

在实验室配置一台设备要用到串口&#xff0c;但串口线只连到了linux服务器上&#xff0c;又不想跑一趟实验室&#xff0c;就直接用linux串口连吧&#xff0c;以前都在windows上用putty&#xff0c; securecrt软件&#xff0c;还真没直接在linux上使用&#xff0c;查一下命令记录…

C++ STL的基本基本原理

STL都是在内存的堆区分配的&#xff0c;但是其析构也是STL帮我们做好的&#xff0c;不用手动去delete。 1.vector 逻辑地址连续的一片内存空间&#xff0c;当空间不足&#xff0c;重新申请新的地址空间&#xff0c;将原有的数据复制过去&#xff0c;而新的地址空间的大小C没有规…

IE9不支持CSS line-height的文字垂直居中解决方法

IE9不支持line-height原因&#xff1a;中文ie9不支持英文字体 相信大家在IE9看见自己使用line-height设置垂直居中文字不能垂直居中&#xff0c;这是与你设置字体有关&#xff0c;通常大家习惯设置font-family:Arial, Helvetica, sans-serif; ie9中line-height失效解决方法&…

iOS 修改项目名称

2019独角兽企业重金招聘Python工程师标准>>> 1. [代码]iOS 修改项目名称 1 2. [图片] 1.png 3. [图片] 2.png 4. [图片] 3.png 5. [图片] 4.png 6. [图片] 5.png 转载于:https://my.oschina.net/5951008876/blog/681857

java wait源码_Java精通并发-透过openjdk源码分析wait与notify方法的本地实现

上一次https://www.cnblogs.com/webor2006/p/11442551.html中通过openjdk从c的底层来审视了ObjectMonitor的底层实现&#xff0c;这次继续来探究底层&#xff0c;对于wait()和notify()的底层细节到底是啥样的呢&#xff1f;下面还是先来到openjdk中来打开ObjectMonitor.hpp&…

jquery实现多级下拉菜单

支持多种浏览器&#xff0c;体验效果&#xff1a;http://keleyi.com/keleyi/phtml/jqmenu/4.htm多级菜单&#xff0c;理论上支持无限多的层级&#xff0c;文件结构非常简单的&#xff0c;以下是完整代码&#xff1a; 1 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 T…

listActivity和ExpandableListActivity的简单用法

今天自己简单的总结了listActivity和ExpandableListActivity二者的简单用法。 首先&#xff0c;先说一下listActivity的用法&#xff1a; ListActivity是一个绑定到一个数据源&#xff0c;并且用来显示这一串数据的Activity。ListActivity拥有一个listview对象来实现数据源的绑…

搭建git for windows服务器(100%可以成功)【转】

转自&#xff1a;http://blog.csdn.net/code_style/article/details/38764203 既然Git在linux下面非常好用&#xff0c;为什么还要搭建git windows的服务器&#xff0c;因为不是所有的用户都需要在linux下面做开发&#xff0c;对吧&#xff0c;还有很多用户选择使用windows做开…

eclipser认java源码_java相关:Eclipse查看开发包jar里源代码的方法

java相关&#xff1a;Eclipse查看开发包jar里源代码的方法发布于 2020-5-21|复制链接摘记: Eclipse查看开发包jar里源代码的方法前言&#xff1a;最近我打算学习一下谷歌的类库Guava&#xff0c;下载了Guava-r09.jar包及其源码&#xff0c;为了可以方面的看其源码&#xff0c;我…

php归档函数(按时间)实现

今日开发本站需要用到按时间归档文章的功能&#xff0c;即按文档发布时间将文章文类&#xff0c;以实现检索和统计功能&#xff0c;于是自己写了一个&#xff0c; 现分享给大家&#xff0c;相信大家工作和学习中有可能会用到&#xff0c;实现原理很简单&#xff0c;即取出文章发…

【转】高性能WEB开发系列之重绘与回流

原文转载&#xff1a;http://www.cnblogs.com/wangzhichao/archive/2011/05/16/2047633.html页面呈现流程 在讨论页面重绘、回流之前。需要对页面的呈现流程有些了解&#xff0c;页面是怎么把html结合css等显示到浏览器上的&#xff0c;下面的流程图显示了浏览器对页面的呈现的…

java字符串颠倒位置_java字符串第一个字符与最后一个字符颠倒位置测试

最近做了一个需求&#xff0c;就是 通过OA 连接到我们系统&#xff0c;然后request里 带有base64加密后的字符串&#xff0c;并且第一个与最后一个位置颠倒了&#xff0c;所以需要先恢复正常的加密串&#xff0c;然后在解密。所以首先工作是 先测试还原加密串&#xff0c;就是第…

C#自定义特性实例

元数据,就是C#中封装的一些类,无法修改.类成员的特性被称为元数据中的注释. 1、什么是特性 &#xff08;1&#xff09;属性与特性的区别 属性(Property)&#xff1a;属性是面向对象思想里所说的封装在类里面的数据字段&#xff0c;Get&#xff0c;Set方法。 特性(Attribute): …

UVA 10054 the necklace 欧拉回路

有n个珠子&#xff0c;每颗珠子有左右两边两种颜色&#xff0c;颜色有1~50种&#xff0c;问你能不能把这些珠子按照相接的地方颜色相同串成一个环。 可以认为有50个点&#xff0c;用n条边它们相连&#xff0c;问你能不能找出包含所有边的欧拉回路 首先判断是否在一个联通分量中…

解决tsvncache.exe引起电脑慢的问题

如果你觉得SVN的cache程序使得你的机器反应很慢的话,那可以参考这个方案.不过可能要改变你以前使用习惯.这个方案有两部分,第一部分是关闭SVN的cache监视;第二部分是显示文件差异时,使用SVN的“check for modifications”显示差异。 1.关闭SVN的cache监视。即关闭tsvncache.exe…