Quelle différence y a-t-il entre les classes WebClient et HTTPWebRequest dans .NET?

178

Quelle différence y a-t-il entre WebClientles HttpWebRequestclasses et les classes dans .NET? Ils font tous les deux des choses très similaires. En fait, pourquoi n'ont-ils pas été fusionnés en une seule classe (trop de méthodes / variables, etc. peuvent être une raison, mais il existe d'autres classes dans .NET qui enfreignent cette règle).

Merci.

GurdeepS
la source

Réponses:

242

WebClient est une abstraction de plus haut niveau construite sur HttpWebRequest pour simplifier les tâches les plus courantes. Par exemple, si vous souhaitez extraire le contenu d'un HttpWebResponse, vous devez lire à partir du flux de réponse:

var http = (HttpWebRequest)WebRequest.Create("http://example.com");
var response = http.GetResponse();

var stream = response.GetResponseStream();
var sr = new StreamReader(stream);
var content = sr.ReadToEnd();

Avec WebClient, il vous suffit de faire DownloadString:

var client = new WebClient();
var content = client.DownloadString("http://example.com");

Remarque: j'ai omis les usingdéclarations des deux exemples par souci de concision. Vous devez absolument veiller à disposer correctement vos objets de requête Web.

En général, WebClient est bon pour les requêtes simples rapides et sales et HttpWebRequest est bon lorsque vous avez besoin de plus de contrôle sur l'ensemble de la demande.

John Sheehan
la source
34
Ce qui précède est un fait, ce qui suit est une opinion: les deux sont terribles car HttpWebRequest est cassé. Il gère mal l'authentification de base, nécessite des solutions de contournement étranges ServicePointManager.Expect100Continue = false, comme faire d'autres choses non standard et a de nombreuses bizarreries et particularités. J'ai lancé RestSharp pour aider à résoudre ces problèmes.
John Sheehan le
4
Notez également que WebClient est un composant, vous pouvez donc le faire glisser / déposer de la fenêtre d'outils VS dans votre formulaire et pouvoir l'utiliser là-bas.
feroze le
1
Je pense que j'ai essayé d'utiliser httpwebrequest avec l'authentification de base il y a quelque temps. Je peux accepter cela. Alors vous avez créé RestSharp? Cool!
GurdeepS
19
Quiconque rencontre cela comme je viens de le faire, notez qu'il y a un nouveau joueur sur le terrain appelé HttpClient.NET 4.5 qui peut (ou non?) Résoudre certains des problèmes ci-dessus ...
Funka
3
WebClient implémente IDisposable, vous devriez donc envisager de le faireusing (WebClient client = new WebClient())
Eric
32

De plus, WebClient n'a pas de propriété timeout. Et c'est le problème, car la valeur dafault est de 100 secondes et c'est trop pour indiquer s'il n'y a pas de connexion Internet.

La solution de contournement pour ce problème est ici https://stackoverflow.com/a/3052637/1303422

Andriy F.
la source
16
La question était quelle était la différence. L'une des différences est que WebClient n'a pas de propriété timeout alors que HttpWebRequest en a.
Andriy F.
26

Je sais que c'est trop long pour répondre, mais juste à titre d'information pour les futurs lecteurs:

Demande Web

System.Object
    System.MarshalByRefObject
        System.Net.WebRequest

La WebRequestest une classe de base abstraite. Vous ne l'utilisez donc pas directement. Vous l'utilisez à travers ses classes dérivées - HttpWebRequestet FileWebRequest.

Vous utilisez la méthode Create de WebRequestpour créer une instance de WebRequest. GetResponseStreamrevient data stream.

Il y a aussi des classes FileWebRequestet des . Normalement, vous devez utiliser , eh bien, faire une demande et convertir le retour à l'une ou l' autre , ou , dépendent de votre demande. Voici un exemple:FtpWebRequestinheritWebRequestWebRequestHttpWebRequestFileWebRequestFtpWebRequest

Exemple:

var _request = (HttpWebRequest)WebRequest.Create("http://stackverflow.com");
var _response = (HttpWebResponse)_request.GetResponse();

WebClient

System.Object
        System.MarshalByRefObject
            System.ComponentModel.Component
                System.Net.WebClient

WebClientfournit des opérations sendinget des receivingdonnées communes à une ressource identifiée par a URI. Simplement, c'est une abstraction de plus haut niveau de HttpWebRequest. Cette « opérations courantes » est ce qui différencie WebClientde HttpWebRequest, comme également indiqué dans l'exemple ci - dessous:

Exemple:

var _client = new WebClient();
var _stackContent = _client.DownloadString("http://stackverflow.com");

Il y a aussi DownloadDataet des DownloadFileopérations sous WebClientinstance. Ces opérations courantes simplifient également le code de ce que nous ferions normalement HttpWebRequest. En utilisant HttpWebRequest, nous devons obtenir la réponse de notre requête, instancier StreamReaderpour lire la réponse et enfin, convertir le résultat dans le type attendu. Avec WebClient, nous appelons simplement DownloadData, DownloadFile or DownloadString.

Cependant, gardez à l'esprit que WebClient.DownloadStringcela ne tient pas compte encodingde la ressource que vous demandez. Donc, vous finiriez probablement par recevoir des caractères étranges si vous ne spécifiez pas et n'encodez pas.

REMARQUE: Fondamentalement, " WebClient prend quelques lignes de code par rapport à Webrequest "

FEUILLE DE SHEKHAR
la source
La classe WebClient utilise-t-elle la méthode Post / Get ..? Veuillez fournir un lien pour décrire
Kartiikeya
WebRequest nous permet d'ajouter le type Request Method ie Get / Post avec une propriété METHOD. où en tant que WebClient n'ont aucune fonctionnalité d'ajout de type de méthode.
SHEKHAR SHETE
1
@SHEKHARSHETE J'ai pu utiliser webClient.UploadData(url, "POST", bytes)pour spécifier la méthode (voir la documentation MSDN ).
Jeff B