C# 如何将 HttpClient Keep-Alive 设置为 false

Posted

技术标签:

【中文标题】C# 如何将 HttpClient Keep-Alive 设置为 false【英文标题】:C# How to set HttpClient Keep-Alive to false 【发布时间】:2016-04-01 13:44:20 【问题描述】:

我在 .NET 上遇到了 HTTP 请求性能低下的问题。对 localhost 上的 REST API 的 HTTP GET 请求大约需要 500 毫秒才能完成。我花了很多时间来修复它。我尝试了很多方法:HttpClientHttpWebRequestWebClientRestSharp。它们都不起作用。网上大部分解决方案都说将Proxy参数设置为null,但还是不行。

我发现减少这个时间的唯一方法是将request的Keep-Alive参数设置为false:

HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = "GET";
request.KeepAlive = false;

HttpWebResponse response = (HttpWebResponse)request.GetResponse();

这很好用。时间减少到 7-10 毫秒。但现在出于某些原因,我需要使用HttpClient 而不是HttpWebRequest。而且我找不到如何将 HttpClient 的 Keep-Alive 设置为 false。我发现的唯一一件事是如何通过将“连接”标头设置为“保持活动”来将其设置为 true。

我正在将此代码用于 HttpClient 的 POST 请求:

        HttpClient _http = new HttpClient();
        _http.DefaultRequestHeaders.Accept.Clear();
        _http.DefaultRequestHeaders.Add("Connection", "Keep-Alive");
        _http.DefaultRequestHeaders.Add("Keep-Alive", "timeout=600");

        var content = new StringContent(
            request, Encoding.UTF8, "application/%appname%+xml");
        content.Headers.ContentType.Parameters.Add(
            new NameValueHeaderValue("type", "payload"));

        HttpResponseMessage response = await _http.PostAsync(uri, content);

而且仍然需要大约 500-600 毫秒才能完成。

【问题讨论】:

***.com/questions/15211812/… ...只是一个想法... @AndreasNiedermair 谢谢,这是 Google 搜索结果中的第一个链接。我已经尝试过了: content.Headers.Add("Keep-Alive", "false");但这也需要 500 多毫秒才能完成。 本次讨论还有:github.com/dotnet/runtime/issues/30104 【参考方案1】:

使用此代码在客户端禁用 HTTP Keep-Alive:

_http.DefaultRequestHeaders.ConnectionClose = true;

这会将Connection 请求标头设置为close

【讨论】:

【参考方案2】:

当您设置HttpWebRequest.KeepAlive = true 时,标头设置为Connection: keep-alive

当您设置HttpWebRequest.KeepAlive = false 时,标头设置为Connection: close

所以你需要

_http.DefaultRequestHeaders.Add("Connection", "close");

【讨论】:

【参考方案3】:

见下面的代码:

HttpClient cli;
...
cli.DefaultRequestHeaders.Add("Connection", "keep-alive");
cli.DefaultRequestHeaders.Add("Keep-Alive", "600");

【讨论】:

它不起作用。我用我的代码更新了一个问题。 您发布的“效果很好”的示例相当于 KeepAlive=False。您声明您尝试的标题相当于 KeepAlive=True。你正在做与你需要做的相反的事情。【参考方案4】:

希望对你有帮助,我已经测试过了

_client.DefaultRequestHeaders.Connection.Add("Keep-Alive");

【讨论】:

【参考方案5】:

我编写了 HttpClientHandler,并在请求之前的处理程序中删除了标题“Connection”。在这种情况下,它设置默认的“连接:保持活动”。即使在此之前您默认将其放在 HttpClient 中,设置属性等。请检查您的处理程序。

【讨论】:

以上是关于C# 如何将 HttpClient Keep-Alive 设置为 false的主要内容,如果未能解决你的问题,请参考以下文章

如何在 C# 中使用 HttpClient 存储 cookie?

如何在 C# 中将 HttpClient PostAsync() 与线程池一起使用?

如何使用 HttpClient 在 ASP.Net C# 中禁用分块传输编码

C# 9+ 中的 HttpClient 空警告

c#:如何使用 httpclient 发布异步请求并获取流?

C#:HttpClient,将多个文件作为MultipartFormDataContent上传时的文件上传进度