為單元測試等非WebBase的項目偽造一個HttpContext , Session 和HttpHeader
在做單元測試的時候HttpContext.Current是為null的
而有些dll是和HttpContext綁定的(很大原因是...net大部分用于web項目)
或者是試圖在windows form 或者console中使用這些dll就掛了...
當然HttpContext.Current是可以賦值的...那么最最簡單的方法就是直接new一個HttpContext給它啦
HttpRequest request = new HttpRequest("", "http://localhost", "");
HttpContext.Current = new HttpContext(request, new HttpResponse(new System.IO.StringWriter()));
好吧 如果需要Session的話還需要添加下面的代碼
System.Web.SessionState.SessionStateUtility.AddHttpSessionStateToContext(
HttpContext.Current, new HttpSessionStateContainer
("",
new SessionStateItemCollection(),
new HttpStaticObjectsCollection(),
20000,
true,
HttpCookieMode.UseCookies,
SessionStateMode.Off,
false
)
);
問題又出現了......有的代碼會讀取HttpHeader...例如ip什么的經常就存儲在這里
更郁悶的是HttpContext的類經常是不能設置HttpHeader的.....
因為這個是只讀的.......
其實只讀這東西在.net中基本是騙人的.也就編譯時有點用
到運行時 別說只讀了 連private 都可以通過反射弄出來
那么就用反射賦值給httpheader吧
var instance = HttpContext.Current.Request.ServerVariables;
Type type = instance.GetType();
BindingFlags temp = BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static;
MethodInfo addStatic = null;
MethodInfo makeReadOnly = null;
MethodInfo makeReadWrite = null;
MethodInfo[] methods = type.GetMethods(temp);
foreach (MethodInfo method in methods)
{
switch (method.Name)
{
case "MakeReadWrite": makeReadWrite = method;
break;
case "MakeReadOnly": makeReadOnly = method;
break;
case "AddStatic": addStatic = method;
break;
}
}
makeReadWrite.Invoke(instance, null);
List<string[]> list = new List<string[]>();
string ip = ServiceContext.IPAddress;
list.Add(new string[] { "HTTP_X_FORWARDED_FOR", ip });
list.Add(new string[] { "HTTP_CLIENT_IP", ip });
list.Add(new string[] { "HTTP_X_FORWARDED", ip });
list.Add(new string[] { "HTTP_X_CLUSTER_CLIENT_IP", ip });
list.Add(new string[] { "HTTP_FORWARDED_FOR", ip });
list.Add(new string[] { "HTTP_FORWARDED", ip });
list.Add(new string[] { "REMOTE_ADDR", ip });
foreach (string[] values in list)
addStatic.Invoke(instance, values);
makeReadOnly.Invoke(instance, null);
浙公網安備 33010602011771號