我试图使用C#修改HTTP标头。我试图在Page preinit事件上操作Request.Headers。但是当我尝试向Headers设置任何内容时,我得到PlatformNotSupportedException。由于我们无法将新的NameValueCollection设置为Reqeust.Headers,因此我尝试使用以下代码设置该值:
Request.Headers.Set(HttpRequestHeader.UserAgent.ToString(), "some value");
知道如何实现这一目标?
答案 0 :(得分:11)
试试这个:
HttpContext.Current.Request.Headers["User-Agent"] = "Some Value";
修改强> 这可能是你的原因: http://bigjimindc.blogspot.com/2007/07/ms-kb928365-aspnet-requestheadersadd.html
其中有一个代码段,它为Request.Headers添加了一个新标头。在Windows 7 32位操作系统上验证。
但您可能想要替换该行:
HttpApplication objApp = (HttpApplication)r_objSender;
使用:
HttpApplication objApp = (HttpApplication)HttpContext.Current.ApplicationInstance;
修改强> 要替换现有的标头值,请使用:
t.InvokeMember("BaseSet", BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance, null, headers, new object[] { "Host", item });
其中“主机”是标题名称。
答案 1 :(得分:3)
添加来自链接博客的完整(工作)代码 - 此博客消失
HttpApplication objApp = (HttpApplication)HttpContext.Current.ApplicationInstance;
HttpRequest Request = (HttpContext)objApp.Context.Request;
//get a reference
NameValueCollection headers = Request.Headers;
//get a type
Type t = headers.GetType();
System.Collections.ArrayList item = new System.Collections.ArrayList();
t.InvokeMember("MakeReadWrite",BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance,null,headers,null);
t.InvokeMember("InvalidateCachedArrays",BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance,null,headers,null);
item.Add("CUSTOM_HEADER_VALUE");
t.InvokeMember("BaseAdd",BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance,null,headers, new object[]{"CUSTOM_HEADER_NAME",item});
t.InvokeMember("MakeReadOnly",BindingFlags.InvokeMethod | BindingFlags.NonPublic | BindingFlags.Instance,null,headers,null);