Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/http/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 删除HttpClient请求中的主机头_C#_Http_Fiddler - Fatal编程技术网

C# 删除HttpClient请求中的主机头

C# 删除HttpClient请求中的主机头,c#,http,fiddler,C#,Http,Fiddler,我正在使用HttpClient类向特定主机发送一些数据。我只想发送一个纯标头,其中没有任何额外的行,比如(“Host:http”)。所以这一行是最后一个从标题中删除的,但我不知道如何删除 守则: HttpRequestMessage msg = new HttpRequestMessage(HttpMethod.Post, aUrl); msg.Headers.Clear(); msg.Headers.Remove("Host"); msg.Headers.ExpectContinue = fa

我正在使用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");
if (oSession.oRequest.headers.HTTPVersion == "HTTP/1.0")
{
    oSession["x-overridehost"] = oSession.host;
    oSession.oRequest.headers.Remove("Host");
}

无济于事。实际上,我还看到添加了标题
代理连接:Keep-Alive

如果仔细检查您的URL,看起来您的URL还是错的:
http://http//
-您的主机真的命名为
http
,您真的需要在它后面加两个斜杠吗?无论如何,如果您解决了这个问题,
Host
标题将携带
localhost.fiddler:60001

通过删除主机头,实际上是将请求降级到HTTP/1.0

您可以在
HttpRequestMessage
中设置HTTP版本,如中所述:

但当使用Fiddler时,它充当代理,并将您的请求作为HTTP/1.1请求转发—再次包括主机头。您还可以在Fiddler中更改请求。这在中进行了解释,但请注意粗体文本,强调我的:

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

不清楚为什么会出现问题--根据定义,任何有问题的服务器都有缺陷,应该修复

如果愿意,可以删除标题(尽管这样做可能会在其他地方引起问题)。单击规则>自定义规则。滚动至OnBeforeRequest并添加以下内容:

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

如果您仔细检查您的URL,看起来您的URL是错误的:
http://http//
-您的主机真的命名为
http
,您真的需要在它后面加两个斜杠吗?无论如何,如果您解决了这个问题,
Host
标题将携带
localhost.fiddler:60001

通过删除主机头,实际上是将请求降级到HTTP/1.0

您可以在
HttpRequestMessage
中设置HTTP版本,如中所述:

但当使用Fiddler时,它充当代理,并将您的请求作为HTTP/1.1请求转发—再次包括主机头。您还可以在Fiddler中更改请求。这在中进行了解释,但请注意粗体文本,强调我的:

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

不清楚为什么会出现问题--根据定义,任何有问题的服务器都有缺陷,应该修复

如果愿意,可以删除标题(尽管这样做可能会在其他地方引起问题)。单击规则>自定义规则。滚动至OnBeforeRequest并添加以下内容:

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

非常感谢CodeCaster提供了如此全面的答案。问题是,我们将不得不使用“非完整标准”http协议,只需再问一个相关问题。我们是否可以使用标准的HttpClient和HttpRequestMessage从标题行中删除“Connection:Keep Alive”呢?我认为默认情况下是关闭的。看见您还必须将Fiddler配置为不重用客户端连接。结果表明,“连接:保持活动”在默认情况下处于启用状态。我们在每个POST请求头中都有这一行。链接下的页面没有帮助我们删除它。认为他们应该是实现这一目标的简单方法。。但这个问题还没有解决。谢谢你的帮助/建议。不,不是。您如何确定它是?非常感谢CodeCaster提供了如此全面的答案。问题是,我们将不得不使用“非完整标准”http协议,只需再问一个相关问题。我们是否可以使用标准的HttpClient和HttpRequestMessage从标题行中删除“Connection:Keep Alive”呢?我认为默认情况下是关闭的。看见您还必须将Fiddler配置为不重用客户端连接。结果表明,“连接:保持活动”在默认情况下处于启用状态。我们在每个POST请求头中都有这一行。链接下的页面没有帮助我们删除它。认为他们应该是实现这一目标的简单方法。。但这个问题还没有解决。谢谢你的帮助/建议。不,不是。你怎么确定它是?