需要有关 HttpWebRequest 对象的帮助

本文关键字:对象 帮助 HttpWebRequest | 更新日期: 2023-09-27 17:47:21

我正在尝试为 .NET 构建代理模块,但我在将标头从当前请求复制到新请求时遇到问题。 我正在设置新请求的标头,因为我希望代理支持 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'参数名称:名称"}


提前感谢您的帮助,

需要有关 HttpWebRequest 对象的帮助

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

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

所以我

把你的回答理解为"不可能显式设置集合"。 我希望有一种方法可以将名称和值添加到 NameValueDictionary,但我想我只需要确定我需要设置哪些字段并使用属性来访问特定的名称/值对象。 我想我可以使用继承并滚动我自己的 HttpWebRequest 对象版本,但我相信Microsoft的人封装集合是有原因的,所以我可能会保持原样。

感谢您对此的帮助。

虽然这是一篇旧文章,但我最近需要为用 .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);
        }
    }
}