web-dev-qa-db-fra.com

C # Comment définir HttpClient Keep-Alive sur false

J'ai eu un problème de performance avec les requêtes HTTP sur .NET. La requête HTTP GET à une API REST sur l'hôte local a pris environ 500 ms. J'ai passé beaucoup de temps à le réparer. J'ai essayé de nombreuses manières: HttpClient, HttpWebRequest, WebClient et RestSharp. Aucun d'entre eux ne fonctionne. La plupart des solutions sur Internet disaient de définir le paramètre Proxy sur null mais cela ne fonctionnera toujours pas plus rapidement.

La seule façon pour moi de réduire ce temps est de définir le paramètre Keep-Alive de request sur false:

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

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

Cela fonctionne très bien. Le temps est réduit à 7-10 ms. Mais maintenant, pour certaines raisons, je dois utiliser HttpClient au lieu de HttpWebRequest. Et je ne trouve pas comment définir Keep-Alive sur false pour HttpClient. La seule chose que j'ai trouvée concerne la définition de true en définissant un en-tête "connection" sur "Keep-Alive".

J'utilise ce code pour la demande POST de 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);

Et cela prend encore environ 500-600 ms à compléter.

17
Vaskrol

Lorsque vous définissez HttpWebRequest.KeepAlive = true, l'en-tête est défini sur Connexion: Keep-Alive

Lorsque vous définissez HttpWebRequest.KeepAlive = false, l'en-tête est défini sur Connexion: fermer

Donc vous aurez besoin 

_http.DefaultRequestHeaders.Add("Connection", "close");
24
Jerry Joseph

Utilisez ce code pour désactiver HTTP Keep-Alive sur le client:

_http.DefaultRequestHeaders.ConnectionClose = true;

Cela définira l'en-tête de la requête Connection sur close.

5
Pavel Chuchuva

Voir le code ci-dessous:

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

J'espère que cela peut vous aider, j'ai testé

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

J'ai écrit HttpClientHandler, et dans le gestionnaire juste avant la demande, j'ai supprimé l'en-tête "Connection". Dans ce cas, il définit la valeur par défaut "Connection: keep-alive". Même si avant cela, vous le placez par défaut dans HttpClient, définissez les propriétés, etc. Vérifiez vos gestionnaires.

0
Anton Ilyin