我使用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
被添加。
答案 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"); }