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.
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");
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
.
voir le code ci-dessous:
HttpClient cli;
...
cli.DefaultRequestHeaders.Add("Connection", "keep-alive");
cli.DefaultRequestHeaders.Add("Keep-Alive", "600");