WebClient vs. HttpWebRequest / HttpWebResponse

Il me semble que la majeure partie de ce qui peut être accompli avec HttpWebRequest/Response peut également être réalisée avec la classe WebClient . J’ai lu quelque part que WebClient est un wrapper de haut niveau pour WebRequest/Response .
Jusqu’ici, je ne vois rien qui puisse être accompli avec HttpWebRequest/Response qui ne peut être accompli avec WebClient , ni où HttpWebRequest / Response vous donnerait un contrôle plus précis.

Quand dois-je utiliser WebClient et quand HttpWebRequest/Response ? (Evidemment, HttpWebRequest/Response est spécifique à HTTP.)

Si HttpWebRequest/Response est de niveau inférieur à WebClient , que puis-je accomplir avec HttpWebRequest/Response que je ne peux pas accomplir avec WebClient ?

Utiliser HttpWebRequest vous donne plus de contrôle sur la requête. Vous pouvez définir des cookies, des en-têtes, des protocoles, etc. Dans la réponse, vous pouvez également récupérer les cookies et les en-têtes.

HttpWebRequest expose beaucoup plus de choses qui vous permettent un contrôle précis du protocole, par exemple: si vous voulez utiliser Keep-Alive, quel pool de connexions utiliser, si vous voulez mettre en mémoire tampon ou non, etc.

WebClient n’expose pas tous ces éléments (même si vous pouvez sous-classer WebClient et accéder à l’object Request sous-jacent).

WebClient est utile dans les situations où vous souhaitez effectuer une opération (par exemple: envoi POST / GET / Form) et vous ne pouvez pas créer et gérer les RequestStream HttpWebRequest , RequestStream , HttpWebResponse et response.

Extrait du blog de Tim Heuer – http://timheuer.com/blog/archive/2008/03/14/calling-web-services-with-silverlight-2.aspx

Au lieu de cela, dans Silverlight, vous souhaiterez utiliser WebClient ou HttpWebRequest. Quelle est la différence? Voici la version timheuer. WebClient est une implémentation plus simple qui exécute très facilement les requêtes GET et obtient un stream de réponses. HttpWebRequest est idéal lorsque vous avez besoin d’un contrôle un peu plus précis sur la requête, vous devez envoyer des en-têtes ou d’autres personnalisations.

La classe WebClient s’exécute sur le thread d’interface utilisateur, de sorte que l’interface utilisateur ne répond pas lorsque des données sont téléchargées depuis Internet. D’autre part, la classe HttpWebRequest ne bloque pas le thread d’interface utilisateur et votre application est réactive. Ainsi, dans les applications où une grande quantité de données doit être téléchargée depuis Internet ou si la source des données est lente à accéder, vous devez utiliser la classe HttpWebRequest; Dans tous les autres cas, vous devez utiliser la classe WebClient.

Le “HtttpWebRequest” est obsolète dans .NET 4.5. Maintenant, cette classe est uniquement interne.

Encore une chose HttpWebrquest permet la compression mais la classe Net.WebClient ne supporte pas la compression HTTP

WebClient présente un autre inconvénient: il ignore la valeur du charset HTTP ContentType lorsque vous l’utilisez pour obtenir le texte de la réponse. Vous devez définir explicitement l’encodage via la propriété Encoding .

Un exemple: publier des données et récupérer des données traitées dans un cycle de demande / réponse semble impossible avec WebClient, mais vous pouvez le faire avec HtttpWebRequest.