gpt4 book ai didi

c# - 在 HttpContext.Current.Request 中模拟 ServerVariables

转载 作者:太空狗 更新时间:2023-10-29 20:13:20 24 4
gpt4 key购买 nike

我的一项服务通过此类代码使用 IIS 提供的服务器变量

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

我尝试的是模拟那些对象并插入我自己的变量/集合并检查一些情况(例如变量丢失,值为 null ...)我能够创建 HttpContext、HttpRequest、HttpResponse 的实例并正确分配它们,但是它们中的每一个都只是一个没有接口(interface)或虚拟属性的普通类,并且 ServerVariables 的初始化发生在幕后的某个地方。

HttpContext 模拟:

var httpRequest = new HttpRequest("", "http://excaple.com/", "");
var stringWriter = new StringWriter();
var httpResponse = new HttpResponse(stringWriter);
var httpContextMock = new HttpContext(httpRequest, httpResponse);
HttpContext.Current = httpContextMock;

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

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"});

失败,错误提示集合是只读的。

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

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 实际上是一个内部类,所以我既不能创建它的实例也不能对其进行强制转换。

所以问题是 - 我如何模拟 ServerVariables 或在其中插入值?谢谢

最佳答案

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

无法访问存储服务器变量的对象。但是可以使用反射访问它。所以使用反射我们可以设置我们想要的值。以下扩展方法将有助于设置任何服务器变量。

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);
}

关于c# - 在 HttpContext.Current.Request 中模拟 ServerVariables,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27132069/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com