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

47

我在.NET上遇到了HTTP请求性能低的问题。本地主机上对REST API的HTTP GET请求需要大约500毫秒才能完成。我花了很多时间来解决它。我尝试了许多方法:HttpClientHttpWebRequestWebClientRestSharp。但是,它们都没有起作用。互联网上的大多数解决方案都说要将Proxy参数设置为null,但它仍然无法更快地工作。

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

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

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

这个很好用。时间缩短到了7-10毫秒。但是现在由于某些原因,我需要使用HttpClient而不是HttpWebRequest。我找不到如何将Keep-Alive设置为false的方法。我唯一找到的是通过将“connection”头设置为“Keep-Alive”来将其设置为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毫秒才能完成。


仅仅是一个想法...在WinRT的HttpClient类中使用保持连接。 - user57508
@AndreasNiedermair 谢谢,这是在谷歌搜索结果中的第一个链接。我已经尝试过这个: content.Headers.Add("Keep-Alive", "false"); 但这也需要超过500毫秒才能完成。 - Vaskrol
这个讨论也在这里: https://github.com/dotnet/runtime/issues/30104 - Pavel Biryukov
5个回答

49

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

_http.DefaultRequestHeaders.ConnectionClose = true;

这将把 Connection 请求头设置为 close


41

当你设置 HttpWebRequest.KeepAlive = true 时,设置的头信息是 Connection: keep-alive

当你设置 HttpWebRequest.KeepAlive = false 时,设置的头信息是 Connection: close

因此您需要

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

4
请见下方代码:
HttpClient cli;
...
cli.DefaultRequestHeaders.Add("Connection", "keep-alive");
cli.DefaultRequestHeaders.Add("Keep-Alive", "600");

它不起作用。我已经更新了一个问题并附上了我的代码。 - Vaskrol
1
你发布的“运行良好”的示例等效于KeepAlive = False。你尝试的标头相当于KeepAlive = True。你现在所做的与你需要做的相反。 - Matt

1

我希望这可以帮助您,我已经测试过了

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

0
我编写了HttpClientHandler,在请求之前的处理程序中删除了“Connection”头。在这种情况下,它会设置默认的“Connection: keep-alive”。即使在此之前您已经通过默认设置属性等将其放入HttpClient中,请检查您的处理程序。

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