需要帮助HttpWebRequest对象

时间:2008-10-07 00:16:44

标签: c# asp.net

我正在尝试为.NET构建代理模块,但是我无法将Headers从当前请求复制到新请求。我正在设置新请求的标头,因为我希望代理支持SOAP请求。这是我的一部分代码。如果需要,我可以发布所有内容,但这是与我遇到的问题相关的唯一部分:


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参数名称:name”}

<小时/> 在此先感谢您的帮助,

CJAM

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:0)

所以我理解你的回答为“明确地设置集合是不可能的”。我希望有一种方法可以为NameValueDictionary添加名称和值,但我想我只需要确定需要设置哪些字段并使用属性来访问特定的名称/值对象。我想我可以使用继承并滚动我自己的HttpWebRequest对象版本,但我确信微软的人们有理由封装集合,所以我可能只是按照它们的方式保留它们。

感谢您的帮助。

答案 2 :(得分: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);
        }
    }
}