【问题标题】:Need Help With HttpWebRequest object需要 HttpWebRequest 对象的帮助
【发布时间】:2008-10-07 00:16:44
【问题描述】:

我正在尝试为 .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\n参数名称:名称”}


在此先感谢您的帮助,

CJAM

【问题讨论】:

    标签: c# asp.net


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      因此,我将您的回复理解为“无法明确设置集合”。我希望有一种方法可以将名称和值添加到 NameValueDictionary,但我想我只需要确定需要设置哪些字段并使用属性来访问特定的名称/值对象。我想我可以使用继承并滚动我自己的 HttpWebRequest 对象版本,但我确信微软的人有理由封装集合,所以我可能会保持原样。

      感谢您对此的帮助。

      【讨论】:

        【解决方案3】:

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2010-09-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2010-12-30
          相关资源
          最近更新 更多