我有一个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
答案 0 :(得分:5)
您可以通过
获取标题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");
但是,要了解某些标题是受限制的,并且无法自由修改。这些是:
我想您应该逐个查看哪些标题可以/想要从传入的呼叫复制到传出的标题。
答案 1 :(得分:0)
对于前。您想要将所有请求标头复制到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 {}
}
}
}
希望它有所帮助。