日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Session的模拟

發布時間:2023/12/13 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Session的模拟 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Session相關的mock

Session相關的mock主要有以下兩個步驟:

1) HttpContext對象的實例化

2 session屬于HttpContext對象,所以簡單來說,就是我們需要構造一個HttpContext,對象然后在給其中的Session附值。然后再把它指定到 System.Web.HttpContext.Current 中

2 MSDN里HttpContext構造函數是公開的,

?

名稱

說明

HttpContext(HttpWorkerRequest)

使用指定的輔助請求對象初始化 HttpContext 類的新實例。

模擬的代碼如下:

但是需要注意的是,如果我們再簡單的增加下面一行,雖然編譯沒有錯誤,但是執行不通過。

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

因為SimpleWorkerRequest并沒有封裝有關Session的功能。

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

這樣我們還需要模擬session。

2) 模擬session的對象

2 Session是HttpSessionState 類型,要mock session,必須要自行創建HttpSessionState。那接下來首先想到的是用HttpSessionState的構造函數來創建。

2 在MSDN上查看HttpSessionState類,

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

發現公開成員和受保護成員均無構造函數。

2 去代碼里看HttpSessionState元數據,也沒有找到構造函數。這就很為難了。

2 上網查找得知,可以用“.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年就可以了

2 繼續上網搜索,發現有人已經把HttpSessionState類直接Reflector出來了,那就直接看成果吧

.net 2.0 下 HttpSessionState 的構造函數變成了下面方式:

internal HttpSessionState(IHttpSessionState container)

{

this._container = container;

}

這樣我們首先要實現一個 IHttpSessionState 接口的對象。

2 查找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

2 由于HttpSessionState的構造函數是internal類型的,要調到它必須通過反射了。

3) HttpContext對象補足

2 結合上述兩點,HttpContext對象和session對象都有了。

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

簡單的賦值是沒用的,因為屬性session是只讀的。

2 通過.NET Reflector可以得知,HttpContext對象里有如下信息

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

這是一個很隱蔽的信息。

2 把包含session信息的HttpContext對象賦給HttpContext.Current即可以模擬session成功了

HttpContext.Current = HttpContext對象;

轉載于:https://www.cnblogs.com/warioland/archive/2011/09/26/2191289.html

總結

以上是生活随笔為你收集整理的Session的模拟的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。