Ich hatte ein Leistungsproblem mit HTTP-Anforderungen unter .NET. Die HTTP-GET-Anforderung an eine REST -API auf dem localhost dauerte etwa 500 ms. Ich habe viel Zeit gebraucht, um das Problem zu beheben. Ich habe viele Möglichkeiten ausprobiert: HttpClient
, HttpWebRequest
, WebClient
und RestSharp
. Keiner von ihnen arbeitet. Die meisten Lösungen im Internet geben an, dass der Proxy
-Parameter auf null
gesetzt wird, aber es funktioniert trotzdem nicht schneller.
Die einzige Möglichkeit, diese Zeit zu reduzieren, besteht darin, den Keep-Alive-Parameter von request auf false zu setzen:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
request.Method = "GET";
request.KeepAlive = false;
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
Das funktioniert super. Die Zeit wird auf 7-10 ms reduziert. Aber jetzt muss ich aus verschiedenen Gründen HttpClient
anstelle von HttpWebRequest
verwenden. Und ich kann nicht finden, wie Keep-Alive für HttpClient
auf false gesetzt wird. Das einzige, was ich gefunden habe, ist, wie man es auf "true" setzt, indem man einen "Connection" -Header auf "Keep-Alive" setzt.
Ich verwende diesen Code für die Anforderung von POST durch HttpClient:
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);
Und es dauert noch ungefähr 500-600 ms, um abzuschließen.
Wenn Sie HttpWebRequest.KeepAlive = true
einstellen, lautet der Kopfsatz Connection: keep-alive
Wenn Sie HttpWebRequest.KeepAlive = false
einstellen, lautet der Kopfsatz Verbindung: Schließen
Also wirst du brauchen
_http.DefaultRequestHeaders.Add("Connection", "close");
Verwenden Sie diesen Code, um HTTP Keep-Alive auf dem Client zu deaktivieren:
_http.DefaultRequestHeaders.ConnectionClose = true;
Dadurch wird der Connection
-Anforderungsheader auf close
gesetzt.
Siehe Code unten:
HttpClient cli;
...
cli.DefaultRequestHeaders.Add("Connection", "keep-alive");
cli.DefaultRequestHeaders.Add("Keep-Alive", "600");
Ich hoffe das kann dir helfen, habe ich getestet
_client.DefaultRequestHeaders.Connection.Add("Keep-Alive");
Ich habe HttpClientHandler geschrieben und im Handler kurz vor der Anfrage habe ich den Header "Connection" gelöscht. In diesem Fall wird die Standardeinstellung "Verbindung: Keep-Alive" festgelegt. Auch wenn Sie es vorher standardmäßig in den HttpClient gestellt haben, legen Sie Eigenschaften usw. fest. Überprüfen Sie Ihre Handler.