如何通过HttpClient将“Connection: keep-alive”标题设置为小写?

5

我有一个任务,需要像Firefox浏览器一样发送Connection: keep-alive头部信息(请注意keep-alive必须全部小写):

"Connection: keep-alive"

然而,我使用HttpClient无法实现。无论我尝试什么,请求总是会出现


"Connection: Keep-Alive"

这里是一个示例代码:

var client = new HttpClient();
var request = new HttpRequestMessage()
{
    RequestUri = new Uri("http://www.someURI.com"),
    Method = HttpMethod.Get,
};
request.Headers.Connection.Clear(); // No need to do it as it is empty anyway
request.Headers.Connection.Add("keep-alive"); // Still results in "Keep-Alive"
var task = client.SendAsync(request);

另一种尝试:

var client = new HttpClient();
client.DefaultRequestHeaders.Clear();
client.DefaultRequestHeaders.Connection.Add("keep-alive"); // Still results in "Keep-Alive"
string result = await client.GetStringAsync("http://www.someURI.com");

有一个有关如何在HttpWebRequest中实现的答案:如何通过HttpWebRequest发送小写Keep-Alive头部

在HttpClient中是否有类似的方法呢?

3个回答

2
你试过这个吗:
var client = new HttpClient();
client.DefaultRequestHeaders.Add("Connection", "keep-alive");

这是它的样子: enter image description here

我使用.NET 4.5。 - Maxime Esprit
我使用一款嗅探软件来查看HTTP请求(类似Wireshark)。在我的情况下,我正在开发Xamarin.Android,我使用名为“Packet Capture”的Android应用程序。 - Maxime Esprit
如果你把它改成“Keep-Alive”,它也会以“Keep-Alive”的形式出现吗?我只是想排除工具限制的可能性。 - foobar
是的,我测试了这段代码 client.DefaultRequestHeaders.Add("Connection", "Keep-Alive"); 并在数据包捕获中得到了 "Connection: Keep-Alive"。 - Maxime Esprit
1
在 Windows 7 控制台应用程序(.Net 4.5.1)中,此代码的结果如下:Connection: keep-alive,Keep-Alive - foobar

2
这个问题只会在Windows平台上运行代码时出现。它存在于.Net和.Net Core 2.0中。其根本原因在于win32库“winhttp.dll”中包含了“Keep-Alive”的硬编码字符串,因此,如果你需要在Windows上使其正常工作,你需要对该dll进行一些处理。
好消息是,这个问题不会影响在Mono或.NET Core 2.0上运行的Linux平台。

在 Windows 平台上,该 bug 已在 .NET Core 2.1 及以上版本中修复。如果您可以尝试升级 .NET Core。 - Jeferson Tenorio

1
无论 "keep-alive" 是否大写,对于 HTTP 服务器来说都没有关系。只需添加文本 "keep-alive"、"Keep-Alive" 或 "KEEP_ALIVE",则应该被视为相同。希望这可以帮助您。

5
尽管规范中并没有要求大小写必须一致,但我最近遇到了一些主机会拒绝那些未使用小写字母的请求,并返回“Forbidden”的错误信息。这种情况非常恼人,让人感到相当烦躁。 - crush

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接