C# Comment définir HttpClient Keep-Alive pour de faux

j'ai eu un problème de faible performance avec les requêtes HTTP sur.NET. La requête HTTP GET à une API REST sur le localhost a pris environ 500 ms à compléter. J'ai passé beaucoup de temps pour y remédier. J'ai essayé de nombreuses façons: HttpClient, HttpWebRequest,WebClient et RestSharp. Aucune de ces travaux. La plupart des solutions sur Internet dit de mettre Proxy paramètre null mais ça ne marchera pas plus vite.

le seul moyen que j'ai trouvé pour réduire ce temps est de définir le paramètre Keep-Alive de request à faux:

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 mettre en persistant à faux HttpClient. La seule chose que j'ai trouvée, c'est comment la définir à true en définissant un en-tête "connection" à "Keep-Alive".

j'utilise ce code pour la requête POST par 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 il faut encore environ 500-600 ms à compléter.

11
demandé sur Vaskrol 2016-04-01 16:44:20

3 réponses

quand vous mettez HttpWebRequest.KeepAlive = true le jeu d'en-tête est connexion: keep-alive

quand vous mettez HttpWebRequest.KeepAlive = false le jeu d'en-tête est connexion: close

vous aurez donc besoin de

_http.DefaultRequestHeaders.Add("Connection", "close");
20
répondu Jerry Joseph 2016-07-28 23:19:43

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

_http.DefaultRequestHeaders.ConnectionClose = true;

cela va mettre Connection en-tête de requête close.

2
répondu Pavel Chuchuva 2018-05-08 04:58:04

voir le code ci-dessous:

HttpClient cli;
...
cli.DefaultRequestHeaders.Add("Connection", "keep-alive");
cli.DefaultRequestHeaders.Add("Keep-Alive", "600");
1
répondu Riad Baghbanli 2016-04-01 15:02:46