2008-10-07 107 views
2

我想为.NET构建一个代理模块,但是我在将头从当前请求复制到新请求时遇到问题。我正在设置新请求的标题,因为我希望代理支持SOAP请求。这是我的代码的一部分。我可以发布一切,如果需要,但这是一个似乎与我有这个问题的唯一部分:需要帮助HttpWebRequest对象

 

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循环,它抛出的头一个异常.Add功能。为了安全起见,我假定该集合具有访问限制。看起来,一些标头值可以通过HttpWebRequest对象本身的属性来访问。然而在这种情况下,我宁愿摆脱抽象并手动设置属性。那我收到的例外是:
{“这头必须使用适当的属性进行修改\ r \ n参数名:名”}


预先感谢您的帮助,

CJAM

回答

3

一些标头实际上直接作为属性公开在HttpWebRequest对象上。这些标题你不能直接设置。例如HttpWebRequest,ContentType和HttpWebRequest.UserAgent

您将需要直接更新这些属性并避免通过Headers属性进行设置。

0

所以我理解你的回答是“不可能明确设置收集。”我希望有一种方法可以向NameValueDictionary添加名称和值,但我想我只需确定需要设置哪些字段并使用这些属性来访问特定的名称/值对象。我想我可以使用继承并且推出我自己版本的HttpWebRequest对象,但是我确信微软的人们有一个背后封装集合的理由,所以我可能只是让事情保持原样。

感谢您的帮助。

0

虽然这是一个旧帖子,但我最近需要为使用.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); 
     } 
    } 
}