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的模拟的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2011年9月19日 面试重点:asp.
- 下一篇: 【转】Tomcat+MyEclipse