删除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

删除HttpClient请求中的Host标头

如果你仔细检查你的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");
}