繁体   English   中英

从调用HttpWebRequest复制HTTP请求/响应头?

[英]Copy HTTP request / response headers from a call to a HttpWebRequest?

我有一个C#WCF服务,它接收请求消息并将其发布到另一个服务。 发布到其他服务是通过HttpWebRequest完成的。 当我将它们发布到其他服务时,如何在我的服务中获取原始请求HTTP标头并将它们放入HttpWebRequest中。

像这样的东西:

HttpRequestMessageProperty httpRequestProp = GetHttpRequestProp(requestMessage);
 HttpWebRequest loHttp = (HttpWebRequest)WebRequest.Create(uri);
  foreach (var item in httpRequestProp.Headers.AllKeys)
            {

                 loHttp.Headers.Add(item, httpRequestProp.Headers[item]);
            }

我知道这不起作用,因为HttpWebRequest loHttp有自己的属性,当我尝试以上述方式设置ContentType时它抛出异常,因为它需要像这样设置:

loHttp.ContentType = httpRequestProp.Headers[HttpRequestHeader.ContentType];

那么有没有办法从调用中复制HTTP请求标头并将它们作为HTTP请求标头放到另一个HttpWebRequest? 此外,原始请求可能还设置了其他自定义标头,我也希望将这些标头也发送到其他服务。

谢谢Adrya

您可以通过获取标题

OperationContext.Current.RequestContext.RequestMessage.Headers

您可以通过设置标头

WebClient.Headers

例:

WebClient wc = new WebClient();
wc.Headers.Add("referer", "http://yourwebsite.com");
wc.Headers.Add("user-agent", "Mozilla/5.0");

但是,要了解某些标题是受限制的,并且无法自由修改。 这些是:

  • 接受
  • 连接
  • 内容长度
  • 内容类型
  • 日期
  • 期望
  • 主办
  • 如果-Modified-Since的
  • 范围
  • 引荐
  • 传输编码
  • 用户代理
  • 代理连接

我想你应该逐个查看哪些标题你可以/想要从传入呼叫复制到传出呼叫。

对于前者 您想要将所有请求标头复制到HttpWebRequest标头:

HttpWebRequest httpWebRequest = (HttpWebRequest)HttpWebRequest.Create(url);
CopyHeaders(httpWebRequest, httpWebRequest.Headers, this.Request.Headers);

和实施:

    void CopyHeaders(object rootTo, NameValueCollection to, NameValueCollection from)
    {
        foreach (string header in from.AllKeys)
        {
            try
            {
                to.Add(header, from[header]);
            }
            catch
            {
                try
                {
                    rootTo.GetType().GetProperty(header.Replace("-", "")).SetValue(rootTo, from[header]);
                }
                catch {}
            }
        }
    }

希望能帮助到你。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM