在HttpClient请求中删除主机头

时间:2015-11-06 09:19:41

标签: c# http fiddler

我使用HttpClient类将一些数据发送到特定主机。我只想发送一个没有任何额外行的纯标题,如(" Host:http")。所以这一行是从标题中删除的最后一行,但我不知道如何。

代码:

HttpRequestMessage msg = new HttpRequestMessage(HttpMethod.Post, aUrl);
msg.Headers.Clear();
msg.Headers.Remove("Host");
msg.Headers.ExpectContinue = false;
Encoding encoding = ConfiguratorASUST.Instance.Encoding ?? Encoding.GetEncoding(ConfiguratorASUST.ENCODING_DEFAULT);
msg.Content = new StringContent(aStr, encoding);
_client.SendAsync(msg);

Fiddler中的结果标题:

POST http://http//localhost.fiddler:60001/POS/POSTELESPIS HTTP/1.1
Content-Type: text/plain; charset=windows-1251
Host: http

此行Host: http需要从邮件标题中删除。但是我怎么能这样做呢?!我尝试了以下方法:

msg.Headers.Clear();
msg.Headers.Remove("Host");

无济于事。实际上我也看到了标题Proxy-Connection: Keep-Alive被添加。

1 个答案:

答案 0 :(得分:5)

如果你仔细检查你的URL,看起来你的错误:http://http// - 你的主人真的被命名为http,你真的需要两个斜杠吗?无论如何,如果你解决了这个问题,Host标题会带有localhost.fiddler:60001

通过删除Host标头,您实际上将您的请求降级为HTTP / 1.0。

您可以按照Set HTTP protocol version in HttpClient

中的说明在HttpRequestMessage中设置HTTP版本
msg.Version = HttpVersion.Version10;

但是当使用Fiddler时,它充当代理,并将您的请求转发为HTTP / 1.1请求 - 再次包括主机头。您也可以在Fiddler中更改请求。这在How do I prevent fiddler from insering "Host" HTTP header?中有解释,但请注意粗体文字,强调我的:

  

根据RFC,作为HTTP / 1.1代理,Fiddler需要添加主机头。

     

目前尚不清楚为什么这有问题 - 任何有问题的服务器,根据定义,都是错误的,应该修复

     

如果您愿意,可以删除标题(尽管这样做会导致其他地方出现问题)。点击规则>自定义规则。滚动到OnBeforeRequest并添加以下内容:

if (oSession.oRequest.headers.HTTPVersion == "HTTP/1.0")
{
    oSession["x-overridehost"] = oSession.host;
    oSession.oRequest.headers.Remove("Host");
}