wake-up-neo.com

C # So legen Sie HttpClient Keep-Alive auf false fest

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.

17
Vaskrol

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");
24
Jerry Joseph

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.

5
Pavel Chuchuva

Siehe Code unten:

HttpClient cli;
...
cli.DefaultRequestHeaders.Add("Connection", "keep-alive");
cli.DefaultRequestHeaders.Add("Keep-Alive", "600");
2
Riad Baghbanli

Ich hoffe das kann dir helfen, habe ich getestet

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

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.

0
Anton Ilyin