C#如何将HttpClient Keep-Alive设置为false
我在.NET上的HTTP请求有一个低性能问题。 对localhost上的REST API的HTTP GET请求大约需要500毫秒才能完成。 我花了很多时间来解决它。 我尝试了很多方法: HttpClient
, HttpWebRequest
, WebClient
和RestSharp
。 他们都没有工作。 互联网上的大多数解决方案都表示将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
。 我无法找到如何为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毫秒才能完成。
当您设置HttpWebRequest.KeepAlive = true
,标头集是Connection:keep-alive
设置HttpWebRequest.KeepAlive = false
,标头集为Connection:close
所以你需要
_http.DefaultRequestHeaders.Add("Connection", "close");
见下面的代码:
HttpClient cli; ... cli.DefaultRequestHeaders.Add("Connection", "keep-alive"); cli.DefaultRequestHeaders.Add("Keep-Alive", "600");
使用此代码禁用客户端上的HTTP Keep-Alive:
_http.DefaultRequestHeaders.ConnectionClose = true;
这会将Connection
请求标头设置为close
。