在做单元测试的时候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 );