WebClient contre HttpWebRequest / HttpWebResponse

132

Il me semble que la plupart de ce qui peut être accompli HttpWebRequest/Responsepeut aussi être accompli avec la WebClientclasse. J'ai lu quelque part qui WebClientest un wrapper de haut niveau pour WebRequest/Response.
Jusqu'à présent, je ne vois rien qui puisse être accompli avec HttpWebRequest/Responsequi ne puisse pas être accompli avec WebClient, ni où HttpWebRequest / Response vous donnera un contrôle plus "fin".

Quand dois-je utiliser WebClient et quand HttpWebRequest/Response? (De toute évidence, HttpWebRequest/Responsesont spécifiques à HTTP.)

Si le HttpWebRequest/Responseniveau est inférieur WebClient, que puis-je accomplir avec HttpWebRequest/Responselequel je ne peux pas accomplir WebClient?

Dan
la source

Réponses:

87

L'utilisation HttpWebRequestvous donne plus de contrôle sur la demande. Vous pouvez paramétrer 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

Thomas Levesque
la source
14
Thomas, toujours pas convaincu ... WebClient a une propriété Headers, vous pouvez récupérer le cookie comme ceci: String cookie = webClient.ResponseHeaders ("Set-Cookie") et le définir: webClient.Headers.Add ("Cookie", " CommunityServer-UserCookie… ");
Dan
14
En utilisant HttpWebRequest, vous pouvez définir un délai d'expiration. Dans WebClient, c'est impossible.
ripper234
14
@ ripper234, en fait il est possible: il vous suffit de Hériter WebClient et passer outre GetWebRequest pour personnaliser le HttpWebRequest
Thomas Levesque
15
@ThomasLevesque si vous héritez du client Web et écrasez le webrequest, il semble inutile d'utiliser le client Web ...
Hagai L
5
@HagaiL, je ne suis pas d'accord ... Vous n'êtes pas obligé de créer toute la demande manuellement, vous pouvez l'utiliser base.GetWebRequestpour la créer et ensuite personnaliser ce que vous voulez
Thomas Levesque
54

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 souhaitez tamponner les écritures ou non, etc.

WebClientn'expose pas tous ceux-ci (bien que vous puissiez sous WebClient-classer et accéder à l'objet Request sous-jacent).

WebClientest utile pour les situations où vous voulez juste faire une opération (par exemple: POST / GET / upload formulaire) et la flemme de créer et de gérer HttpWebRequest, RequestStream, HttpWebResponseet flux de réponse.

féroce
la source
13
De plus, il y a une autre chose que j'ai oublié de mentionner. WebClient est un objet Component, contrairement à HttpWebRequest. Qu'est-ce que ça veut dire? Eh bien, si vous utilisez VisualStudio pour créer une application GUI, vous pouvez faire glisser / déposer le composant WebClient sur votre formulaire et l'utiliser pour envoyer des demandes aux serveurs HTTP / FTP, etc.
feroze
14

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 permettant de faire des requêtes GET très facilement et d'obtenir un flux de réponse. HttpWebRequest est idéal lorsque vous avez besoin d'un contrôle un peu plus granulaire sur la demande, que vous devez envoyer des en-têtes ou d'autres personnalisations.

Benjamin Cox
la source
7
WebClient permet également POST, avec UploadString, UploadData et UploadFile
Thomas Levesque
@ThomasLevesque Existe-t-il une version plus récente des cours aujourd'hui? Je vois que cette discussion est un peu, hmm ... vieillie ...
Konrad Viltersten
@KonradViltersten, je ne pense pas qu'il y ait eu beaucoup de changements dans la classe WebClient. Pour les nouvelles applications, je vous suggère d'utiliser HttpClient à la place, qui est également très facile à utiliser et beaucoup plus flexible.
Thomas Levesque
1
@ThomasLevesque Oui, c'est à ça que je pensais. J'ai rappelé http comme étant la différence dans le nom de la classe et j'ai été induit en erreur par Http ... part. Maintenant, je suis de retour sur la bonne voie. Merci!
Konrad Viltersten
12

La classe WebClient s'exécute sur le thread de l'interface utilisateur, de sorte que l'interface utilisateur ne répond pas pendant le téléchargement des données à partir d'Internet. En revanche, la classe HttpWebRequest ne bloque pas le thread de l'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 à partir d'Internet ou si l'accès à la source des données est lent, vous devez utiliser la classe HttpWebRequest; dans tous les autres cas, vous devez utiliser la classe WebClient.

Baaziz
la source
1
Le contraire est vrai sur WP7. HttpWebRequest retourne au thread d'interface utilisateur dans Mango, ce qui me cause un chagrin sans fin pour le moment. Grrr
Cameron MacFarland
6
WebClient prend également en charge les méthodes asynchrones.
CyberMonk
6

Un autre inconvénient de WebClientest - il ne tient pas compte du HTTP ContentTypede » charsetvaleur lorsque vous l' utilisez pour obtenir le texte de réponse. Vous devez définir explicitement l'encodage via la Encodingpropriété.

Sam
la source
C'est un bon point; et il ne s'agit pas seulement de définir le Encoding- vous ne pouvez pas connaître le codage avant la demande, donc l'API WebClient rend très improbable que vous puissiez télécharger correctement une chaîne dans un codage inconnu.
Eamon Nerbonne
5

Une dernière chose que HttpWebrquest vous permet de compresser mais la classe Net.WebClient ne prend pas en charge la compression HTTP

Zain Ali
la source
3
Tout comme tous les autres exemples de WebClient masquant certains détails, cela peut être corrigé en sous-classant WebClient et en remplaçant GetWebRequest. Dans ce cas, vous modifiezHttpWebRequest.AutomaticDecompressiong simplement la propriété sous-jacente ).
patridge
5

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

Julio Spader
la source
2
En effet. Utilisez WebRequestplutôt.
silkfire
2
La classe n'est pas obsolète, les constructeurs le sont. Et la classe n'est pas interne, elle est toujours publique.
user247702
2

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

synergique
la source
2
Utilisez simplement WebClient.UploadString ou WebClient.UploadData pour effectuer un POST et récupérer une chaîne de réponse ou un tableau d'octets.
samjudson le
2
Pour clarifier, la valeur de retour de UploadString est une chaîne et la valeur de retour de la méthode UploadData est un tableau d'octets.
Norman H