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,一经查实,立即删除!

相关文章

C++ STL的基本基本原理

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

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&…

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做开…

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

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

[数据结构与算法] 单链表的简单demo

Vc6之下编译通过。。 1 /*******************************************************2 * : Project: 单链表数据结构演示3 * : File: link_list.h4 * : Function&#xff1a; 提供单链表操作的数据结构定义及方法声明5 * : History: 2013-10-01 22:37:056 * : Auth…

c++ 17介绍

作者&#xff1a;hearts zh链接&#xff1a;https://www.zhihu.com/question/32222337/answer/55238928来源&#xff1a;知乎著作权归作者所有。商业转载请联系作者获得授权&#xff0c;非商业转载请注明出处。其实现在的proposal很多很多&#xff0c;不出意外也会有相当一部分…

“高考”机器人横空出世 2017年居然要考“大学”

文/辛东方&#xff0c;80后作家、专栏作者、专注互联网科技领域人工智能的发展&#xff0c;科学技术的全力配合&#xff0c;已经把人类的智慧实实在在的体现到了智能化设备上。按照目前的发展速度&#xff0c;人工智能要想真正突破技术难关&#xff0c;达到进一步的智能化&…

谁说菜鸟不会数据分析--数据分析那些事儿

一、数据分析是“神马” 1、 何谓数据分析 简单来说&#xff0c;数据分析就是对数据进行分析&#xff0c;较为专业的说法&#xff0c;数据分析是指用适当的统计分析方法对收集来的大量数据进行分析&#xff0c;将它们加以汇总、理解并消化&#xff0c;以求最大化地开发数据的功…

优集品 php,从细节处着眼 优集品打造成人世界的儿童节

在各大电商企业仍旧在史上最大规模的价格战中拼的不可开交之时&#xff0c;重视用户体验度&#xff0c;以商品传递生活理念而知名的全球优选设计百货--LivePort优集品(http://www.liveport.cn/)&#xff0c;已然细心的为眼下即将来临的六一儿童节策划了一餐盛宴&#xff0c;为追…

java中ssm付款代码,ssm实现支付宝支付功能(图文详解)

目录1、支付宝沙箱环境测试2、支付宝整合到ssm环境3、微信支付整合到ssm环境一、支付宝测试环境代码测试1.下载电脑网站的官方demo&#xff1a;2.下载解压导入eclipsereadme.txt请好好看一下。只有一个Java配置类&#xff0c;其余都是JSP。3.配置AlipayConfig(1).注册蚂蚁金服开…

获取android手机的屏幕分辨率 android开发

2019独角兽企业重金招聘Python工程师标准>>> /** * 获取屏幕分辨率 */ private void getResolution() { // TODO Auto-generated method stub Display display getWindowManager().getDefaultDisplay(); DisplayMetrics displayMetrics new DisplayMetrics(); dis…

Python线程指南 ---转自 http://www.cnblogs.com/huxi/archive/2010/06/26/1765808.html

Python线程指南 ---转自 http://www.cnblogs.com/huxi/archive/2010/06/26/1765808.html 本文介绍了Python对于线程的支持&#xff0c;包括“学会”多线程编程需要掌握的基础以及Python两个线程标准库的完整介绍及使用示例。 注意&#xff1a;本文基于Python2.4完成&#xff0c…

有的日期输入框,可直接调用javascripts

转载于:https://www.cnblogs.com/rf-bear/p/5549126.html

TigerDLNA for ios 集成Tlplayer

好久没有写博客了&#xff0c;这次带着TigerDLNA for ios 跟大家见面 什么都不说先上图 1.优点 优点由于libTigerDLNA使用uiview封装&#xff0c;所以大家可以很方便的集成到自己的项目中。由于集成了tlplayer当然也可以只是作为一个播放器来使用&#xff0c;支持各种网络协议。…

Android——Fragment实例精讲——底部导航栏+ViewPager滑动切换页面

说明&#xff1a; 实现效果&#xff1a; 1- 用ViewPager实现Fragmen之间的切换 2- 底部用RadioGroup实现&#xff0c;更方便的实现图片和字体颜色的改变&#xff0c;更方便的通过RadioButton的点击事件来控制页面切换 原文地址&#xff1a;http://www.runoob.com/w3cnote/andro…

springmvc错误 Spring3.X jdk8 java.lang.IllegalArgumentException

最近在学习springmvc--碰到一个特别蛋疼的错误 javax.servlet.ServletException: Servlet.init() for servlet springMVC threw exceptionorg.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:504)org.apache.catalina.valves.ErrorReportValv…

axure 鼠标样式,Axure8-动态面板+简单鼠标事件实现单页面应用

随着互联网的发展&#xff0c;各种网站技术以及网站的呈现技术层出不穷&#xff0c;网站的页面展现已经从之前的页面间跳转到现在大行其道的单页面应用&#xff0c;页面内容的切换不再需要进行页面的跳转了&#xff0c;使用起来更加舒适。功能在变化&#xff0c;技术在变迁&…

c3p0配置

2019独角兽企业重金招聘Python工程师标准>>> <?xml version"1.0" encoding"utf-8"?> <c3p0-config> <named-config name"mysql"> <property name"user">root</property> …