在HttpContext.Current.Request模拟ServerVariables [英] Mock ServerVariables in the HttpContext.Current.Request

查看:515
本文介绍了在HttpContext.Current.Request模拟ServerVariables的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我的一个服务,通过使用这种代码

One of my services uses server variable provided by IIS through such code

var value = System.Web.HttpContext.Current.Request.ServerVariables["MY_CUSTOM_VAR"];



我已经试过是嘲笑那些对象,并插入我自己的变量/收集和检查少数病例(如变量缺失,值为null ......)我能够创造的HttpContext,HttpRequest对象,HttpResponse对象的实例,并将它们分配适当但是他们每个人只是没有ServerVariables的接口或虚拟财产和初始化一个普通类偏偏某处

HttpContext mocking:

HttpContext的嘲弄$ C> VAR的HttpRequest =新的HttpRequest(,http://excaple.com/,);
变种的StringWriter =新的StringWriter();
变种的HttpResponse =新的HttpResponse(StringWriter的);
变种httpContextMock =新的HttpContext(HttpRequest对象,HttpResponse对象);
HttpContext.Current = httpContextMock;



尝试#1 通过反射调用私有方法

Attempt #1 Call private method via reflection

var serverVariables = HttpContext.Current.Request.ServerVariables;
var serverVariablesType = serverVariables.GetType();
MethodInfo addStaticMethod = serverVariablesType.GetMethod("AddStatic", BindingFlags.Instance | BindingFlags.FlattenHierarchy | BindingFlags.NonPublic);

addStaticMethod.Invoke(serverVariables, new object[] {"MY_CUSTOM_VAR", "value"});



错误说集合是只读的失败。

Failed with error saying that collection is readonly.

尝试#2 用我自己的实例替换ServerVariables

Attempt #2 Replace ServerVariables with my own instance

var request = HttpContext.Current.Request;
var requestType = request.GetType();
var variables = requestType.GetField("_serverVariables", BindingFlags.Instance | BindingFlags.NonPublic);

variables.SetValue(request, new NameValueCollection
{
    { "MY_CUSTOM_VAR", "value" }
});



失败,错误,它不可能投的NameValueCollection到HttpServerVarsCollection。那是因为HttpServerVarsCollection实际上是一个内部类,所以我不能既做它的一个实例或铸造它

Failed with error that it's not possible to cast NameValueCollection to HttpServerVarsCollection. That's because HttpServerVarsCollection is actually a internal class so I couldn't either to make an instance of it or cast to it.

所以现在的问题是 - 我怎么能嘲笑ServerVariables或插入值吗?谢谢

So the question is - How can I mock ServerVariables or insert value there? Thanks

推荐答案

我找到了答案这里的 http://forums.asp.net/t/1125149.aspx

这是不可能的访问对象存储服务器变量。但它可以使用反射来访问。因此,使用反射,我们可以设置我们想要的值。下面的扩展方法将帮助设置的任何服务器变量。

It is not possible to access the objects that stores server variables. But it can be accessed using reflection. So using reflection we can set the values that we want. Following extension method will help set any server variable.

public static void AddServerVariable(this HttpRequest request, string key, string value)
    {
        BindingFlags temp = BindingFlags.NonPublic | BindingFlags.Instance | BindingFlags.Static;
        MethodInfo addStatic = null;
        MethodInfo makeReadOnly = null;
        MethodInfo makeReadWrite = null;

        Type type = request.ServerVariables.GetType();
        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(request.ServerVariables, null);
        string[] values = { key, value };
        addStatic.Invoke(request.ServerVariables, values);
        makeReadOnly.Invoke(request.ServerVariables, null);
    }

这篇关于在HttpContext.Current.Request模拟ServerVariables的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆