【问题标题】:How to set "Connection: keep-alive" header in lower case through HttpClient?如何通过 HttpClient 将“Connection: keep-alive”标头设置为小写?
【发布时间】:2017-12-03 20:21:41
【问题描述】:

我有一个任务,我需要能够发送 Connection: keep-alive 标头,其方式与 Firefox 浏览器完成的方式相同(请注意,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中有一个关于如何完成的答案:How to send lower-case Keep-Alive header through HttpWebRequest

在 HttpClient 中是否会出现类似的情况?

【问题讨论】:

    标签: c# httpclient keep-alive


    【解决方案1】:

    你试过了吗:

    var client = new HttpClient();
    client.DefaultRequestHeaders.Add("Connection", "keep-alive");
    

    它给出了这个:

    【讨论】:

    • 我使用 .NET 4.5。
    • 我使用嗅探软件来查看 HTTP 请求(类似于 Wireshark)。就我而言,我正在 Xamarin.Android 上进行开发,我使用名为“Packet Capture”的 android 应用程序。
    • 如果您将其更改为“Keep-Alive”,它是否也会以“Keep-Alive”的形式出现?我只是想排除工具限制。
    • 是的,我对此进行了测试,并使用此代码 client.DefaultRequestHeaders.Add("Connection", "Keep-Alive"); 在数据包捕获中得到“连接:保持活动”。
    • 在 Windows 7 控制台应用程序 (.Net 4.5.1) 中,此代码会产生以下结果:Connection: keep-alive,Keep-Alive
    【解决方案2】:

    此问题在您在 Windows 平台上运行代码时出现。它存在于 .Net 和 .Net Core 2.0 中。其根本原因在于 win32 库“winhttp.dll”,其中包含“Keep-Alive”的硬编码字符串,因此如果您需要让它在 Windows 上运行,您需要对这个 dll 做一些事情。

    好消息是此问题不会影响运行 Mono 或 .NET Core 2.0 的 Linux 平台

    【讨论】:

    • 在 Windows 平台中,该错误已在 .NET Core 2.1 及更高版本上修复。如果您可以尝试升级 .NET Core。
    【解决方案3】:

    “keep-alive”是否为大写对于 HTTP Server 无关紧要。 只需添加文本“keep-alive”或“Keep-Alive”或“KEEP_ALIVE”即可。

    希望这会有所帮助。

    【讨论】:

    • 虽然规范说这无关紧要,但我最近遇到了一些主机,如果它不是小写的,它们会将请求拒绝为 Forbidden。狂野而令人愤怒,我知道。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-20
    • 2016-09-07
    • 2016-04-03
    • 2013-07-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多