開發 Web 專案時常會使用到 HttpContext 物件,例如使用 HttpContext.Current 取得資料,而有時候我們可能會因為單元測試方便、分工或其他因素,將一些功能寫在別的類別庫專案再進行引用。但是非 Web 專案使用到 HttpContext.Current 就會發現他是 Null 而無法使用,所以我們必須自行模擬建立 HttpContext 物件:

首先加入參考,於 [.NET] 的頁籤加入 [System.Web];如果找不到的話,先調整專案屬性,於 [應用程式] => [目標Framework] 選擇非 Client Profile 的版本,例如 .NET Framework 4

接著加入以下程式碼即可

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
using System.Web;
using System.Web.SessionState;
using System.Security.Principal;
using System.IO;

// ...

HttpContext.Current = new HttpContext(new HttpRequest("", "http://localhost", ""), new HttpResponse(new StringWriter()));

// 允許使用Session
SessionStateUtility.AddHttpSessionStateToContext(HttpContext.Current, new HttpSessionStateContainer("", new SessionStateItemCollection(), new HttpStaticObjectsCollection(), 20000, true, HttpCookieMode.UseCookies, SessionStateMode.Off, false));

// 模擬user登入
HttpContext.Current.User = new GenericPrincipal(new GenericIdentity("user"), null);

// 模擬未登入使用者
//HttpContext.Current.User = new GenericPrincipal(new GenericIdentity(""), null);