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 毫秒才能完成。我花了很多时间来修复它。我尝试了很多方法:HttpClient
、HttpWebRequest
、WebClient
和RestSharp
。它们都不起作用。网上大部分解决方案都说将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# 中禁用分块传输编码