C# 需要有关HttpWebRequest对象的帮助吗
我正在尝试为.NET构建代理模块,但在将头从当前请求复制到新请求时遇到问题。我正在设置新请求的头,因为我希望代理支持SOAP请求。这是我代码的一部分。如果需要,我可以发布所有内容,但这是唯一与我所面临的问题相关的部分:C# 需要有关HttpWebRequest对象的帮助吗,c#,asp.net,C#,Asp.net,我正在尝试为.NET构建代理模块,但在将头从当前请求复制到新请求时遇到问题。我正在设置新请求的头,因为我希望代理支持SOAP请求。这是我代码的一部分。如果需要,我可以发布所有内容,但这是唯一与我所面临的问题相关的部分: HttpApplication app = (HttpApplication)sender; // sender from context.BeginRequest event HttpRequest crntReq = app.Request; // set a ref
HttpApplication app = (HttpApplication)sender; // sender from context.BeginRequest event
HttpRequest crntReq = app.Request; // set a reference to request object for easier access
HttpWebRequest proxyReq = (HttpWebRequest)HttpWebRequest.Create(crntReq.Url.AbsoluteUri);
// parse headers from current httpcontext.request.headers and add each name->value to the
// new request object
foreach (string header in crntReq.Headers)
{
proxyReq.Headers.Add(header, crntReq.Headers[header]); // throws exception :(
}
当我的代码命中foreach循环时,它会抛出Headers.Add函数的异常。为了安全起见,我假设集合有访问限制。似乎可以通过HttpWebRequest对象本身的属性访问某些标头值。然而,在这种情况下,我宁愿放弃抽象并手动设置属性。我收到的异常是:
{“必须使用适当的属性修改此标头。\r\n参数名称:名称”}
提前感谢您的帮助
CJAM一些头实际上作为属性直接公开在HttpWebRequest对象上。不允许直接设置这些标题。e、 g HttpWebRequest、ContentType和HttpWebRequest.UserAgent
您需要直接更新这些属性,并避免通过Headers属性设置它们。因此我理解您的回答是“无法明确设置集合”。我希望有一种方法可以将名称和值添加到NameValueDictionary,但我想我只需要确定需要设置哪些字段并使用属性来访问特定的名称/值对象。我想我可以使用继承并滚动我自己版本的HttpWebRequest对象,但我相信微软的人封装集合是有原因的,所以我可能会保持原样
感谢您在这方面的帮助。虽然这是一篇老文章,但我最近需要为一个用.NET编写的HTTP代理做这件事,下面是我如何在两个不同的请求之间复制头的。欢迎反馈,我希望它能帮助别人
static void CopyHeaders (HttpRequest sourceRequest, HttpWebRequest targetRequest) {
foreach (string key in sourceRequest.Headers) {
var value = sourceRequest.Headers[key];
object objectValue = value;
var propName = key.Replace("-", string.Empty);
switch (key) {
case "Host":
case "Content-Length":
// Do not propogate Host and Content-Length.
continue;
case "Connection":
// Cannot set the following values ...
if (value == "Keep-Alive" || value == "Close") {
continue;
}
break;
case "If-Modified-Since":
objectValue = DateTime.Parse(value);
break;
}
var prop = targetRequest.GetType().GetProperty(propName, BindingFlags.Public | BindingFlags.Instance);
if (null != prop && prop.CanWrite) {
prop.SetValue(targetRequest, objectValue, null);
} else {
targetRequest.Headers[key] = Convert.ToString(value);
}
}
}