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.
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");
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
.
Voir le code ci-dessous:
HttpClient cli;
...
cli.DefaultRequestHeaders.Add("Connection", "keep-alive");
cli.DefaultRequestHeaders.Add("Keep-Alive", "600");
J'espère que cela peut vous aider, j'ai testé
_client.DefaultRequestHeaders.Connection.Add("Keep-Alive");
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.