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

Vas*_*rol 22 .net c# rest httpclient httpwebresponse

我在.NET上的HTTP请求有一个低性能问题.对localhost上的REST API的HTTP GET请求大约需要500毫秒才能完成.我花了很多时间来解决它.我曾尝试过很多办法:HttpClient,HttpWebRequest,WebClientRestSharp.他们都没有工作.互联网上的大多数解决方案都说要设置Proxy参数,null但它仍然无法更快地运行.

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

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

HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Run Code Online (Sandbox Code Playgroud)

这非常有效.时间减少到7-10毫秒.但现在由于某些原因我需要使用HttpClient而不是HttpWebRequest.而且我找不到如何将Keep-Alive设置为false HttpClient.我发现的唯一一件事就是如何通过将"连接"标题设置为"保持活跃"来将其设置为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);
Run Code Online (Sandbox Code Playgroud)

它仍然需要大约500-600毫秒才能完成.

Jer*_*eph 27

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

设置HttpWebRequest.KeepAlive = false标题集时,Connection:close

所以你需要

_http.DefaultRequestHeaders.Add("Connection", "close");
Run Code Online (Sandbox Code Playgroud)


Pav*_*uva 20

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

_http.DefaultRequestHeaders.ConnectionClose = true;
Run Code Online (Sandbox Code Playgroud)

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


Ria*_*nli 5

参见下面的代码:

HttpClient cli;
...
cli.DefaultRequestHeaders.Add("Connection", "keep-alive");
cli.DefaultRequestHeaders.Add("Keep-Alive", "600");
Run Code Online (Sandbox Code Playgroud)