删除HttpClient请求中的Host标头
本文关键字:Host 标头 HttpClient 请求 删除 | 更新日期: 2023-09-27 18:20:45
我正在使用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
。
如果你仔细检查你的URL,它看起来是你的。不管怎样,它都是错误的:http://http//
-你的主机真的命名为http
吗?你真的需要在它后面加两个斜杠吗?无论如何,如果您修复了这个问题,Host
标头将携带localhost.fiddler:60001
。
通过删除Host标头,您实际上是在将请求降级为HTTP/1.0。
您可以在HttpRequestMessage
中设置HTTP版本,如在HttpClient:中设置HTTP协议版本所述
msg.Version = HttpVersion.Version10;
但当使用Fiddler时,它充当代理,并将您的请求作为HTTP/1.1请求转发,再次包括主机标头。您也可以在Fiddler中更改请求。这在"如何防止fiddler插入"Host"HTTP标头?"中有解释?,但请注意粗体文本,强调我的:
根据RFC,作为HTTP/1.1代理,Fiddler需要添加一个Host标头。
目前尚不清楚这是有问题的原因——根据定义,任何有问题的服务器都是有缺陷的,应该修复。
如果您愿意,可以删除标头(尽管这样做可能会在其他地方造成问题)。单击"规则">"自定义规则"。滚动至OnBeforeRequest并添加以下内容:
if (oSession.oRequest.headers.HTTPVersion == "HTTP/1.0") { oSession["x-overridehost"] = oSession.host; oSession.oRequest.headers.Remove("Host"); }