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?

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


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.


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.


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.


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é.


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

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


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.


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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.