Performances de HttpWebRequest à l’aide de POST

J’ai un petit outil que j’utilise pour tester un service Web.

Il peut appeler le service Web à l’aide de POST ou à l’aide de GET.

Le code pour utiliser POST est

public void PerformRequest() { WebRequest webRequest = WebRequest.Create(_uri); webRequest.ContentType = "application/ocsp-request"; webRequest.Method = "POST"; webRequest.Credentials = _credentials; webRequest.ContentLength = _request.Length; ((HttpWebRequest)webRequest).KeepAlive = false; using (Stream st = webRequest.GetRequestStream()) st.Write(_request, 0, _request.Length); using (HttpWebResponse httpWebResponse = (HttpWebResponse)webRequest.GetResponse()) using (Stream responseStream = httpWebResponse.GetResponseStream()) using (BufferedStream bufferedStream = new BufferedStream(responseStream)) using (BinaryReader reader = new BinaryReader(bufferedStream)) { if (httpWebResponse.StatusCode != HttpStatusCode.OK) throw new WebException("Got response status code: " + httpWebResponse.StatusCode); byte[] response = reader.ReadBytes((int)httpWebResponse.ContentLength); httpWebResponse.Close(); } } 

Le code d’utilisation de GET est:

 protected override void PerformRequest() { WebRequest webRequest = WebRequest.Create(_uri + "/" + Convert.ToBase64Ssortingng(_request)); webRequest.Method = "GET"; webRequest.Credentials = _credentials; ((HttpWebRequest)webRequest).KeepAlive = false; using (HttpWebResponse httpWebResponse = (HttpWebResponse)webRequest.GetResponse()) using (Stream responseStream = httpWebResponse.GetResponseStream()) using (BufferedStream bufferedStream = new BufferedStream(responseStream)) using (BinaryReader reader = new BinaryReader(bufferedStream)) { if (httpWebResponse.StatusCode != HttpStatusCode.OK) throw new WebException("Got response status code: " + httpWebResponse.StatusCode); byte[] response = reader.ReadBytes((int)httpWebResponse.ContentLength); httpWebResponse.Close(); } } 

Comme vous pouvez le constater, le code est assez similaire. Au contraire, je m’attendrais à ce que la méthode GET soit légèrement plus lente, car elle doit encoder et transmettre les données en Base64.

Mais lorsque je l’exécute, je constate que la méthode POST utilise beaucoup plus de puissance de traitement que la méthode GET. Sur ma machine, je peux exécuter 80 threads de la méthode GET en utilisant environ 5% de CPU, tandis que 80 threads de la méthode POST utilisent 95% de CPU.

Y a-t-il quelque chose de plus coûteux par nature à utiliser POST? Est-ce que je peux faire quelque chose pour optimiser la méthode POST? Je ne peux pas réutiliser la connexion car je veux simuler des demandes provenant de différents clients.

dotTrace indique que WebRequest.GetResponse () utilise 65% du temps de traitement lors de l’utilisation de POST.

Le service Web sous-jacent utilise l’authentification Digest si cela fait une différence.

Eh bien, en fonction de la complexité de l’URI final, il se peut que les demandes “GET” soient mises en cache? “POST” n’est pas mis en cache par défaut, mais “GET” l’est souvent (comme cela devrait être idempotent). Avez-vous essayé de renifler pour voir s’il y avait une différence ici?

En outre, vous trouverez peut-être que WebClient plus facile à utiliser, par exemple:

 using (WebClient wc = new WebClient()) { byte[] fromGet = wc.DownloadData(uriWithData); byte[] fromPost = wc.UploadData(uri, data); }