185 votes

Quelle est la différence entre les classes WebClient et HTTPWebRequest en .NET ?

Quelle différence y a-t-il entre les WebClient et le HttpWebRequest dans .NET ? Elles font toutes deux des choses très similaires. En fait, pourquoi n'ont-elles pas été fusionnées en une seule classe (trop de méthodes/variables, etc. peuvent être une raison, mais il y a d'autres classes dans .NET qui brisent cette règle).

Merci.

245voto

Runscope API Tools Points 43859

WebClient est une abstraction de plus haut niveau construite au-dessus de HttpWebRequest pour simplifier les tâches les plus courantes. Par exemple, si vous souhaitez obtenir le contenu d'une réponse HttpWebResponse, vous devez lire le flux de la 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 suffit de faire DownloadString :

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

Note : J'ai laissé de côté le using les déclarations des deux exemples pour des raisons de brièveté. Vous devez absolument veiller à vous débarrasser correctement de vos objets de requête web.

En général, WebClient est bon pour les requêtes simples et rapides et HttpWebRequest est bon lorsque vous avez besoin de plus de contrôle sur la requête entière.

36 votes

Ce qui précède est un fait, ce qui suit est une opinion : les deux sont terribles parce que HttpWebRequest est cassé. Il gère mal l'authentification de base, ce qui nécessite des solutions de contournement bizarres comme ServicePointManager.Expect100Continue = false font d'autres choses non standard et ont beaucoup de bizarreries et d'idiosyncrasies. J'ai commencé RestSharp pour aider à résoudre ces problèmes.

4 votes

Notez également que WebClient est un composant. Vous pouvez donc le glisser/déposer de la fenêtre d'outils de VS dans votre formulaire et l'y utiliser.

19 votes

Si vous tombez dessus comme je viens de le faire, notez qu'il y a un nouveau joueur sur le terrain appelé HttpClient qui est livré avec .NET 4.5 et qui peut (ou ne peut pas ?) résoudre certains des problèmes ci-dessus...

33voto

Andriy F. Points 714

De plus, le WebClient ne dispose pas de la propriété timeout. Et c'est là le problème, car la valeur par défaut 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

17 votes

La question était de savoir 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 une.

27voto

SHEKHAR SHETE Points 1412

Je sais qu'il est trop tard pour répondre mais juste à titre d'information pour les futurs lecteurs :

WebRequest

System.Object
    System.MarshalByRefObject
        System.Net.WebRequest

El WebRequest est une classe de base abstraite. Donc, en fait, vous ne l'utilisez pas directement. Vous l'utilisez à travers ses classes dérivées - HttpWebRequest y FileWebRequest .

Vous utilisez la méthode Create de WebRequest pour créer une instance de WebRequest . GetResponseStream renvoie à data stream .

Il existe également FileWebRequest y FtpWebRequest des classes qui inherit de WebRequest . Normalement, vous devriez utiliser WebRequest pour, eh bien, faire une demande et convertir le retour en soit HttpWebRequest , FileWebRequest o FtpWebRequest dépendent de votre demande. Vous trouverez ci-dessous un exemple :

Ejemplo:

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

WebClient

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

WebClient fournit des opérations communes pour sending y receiving des données provenant d'une ressource identifiée par un URI . Il s'agit simplement d'une abstraction de plus haut niveau de HttpWebRequest . Ces "opérations communes" sont ce qui différencie WebClient de HttpWebRequest comme le montre également l'exemple ci-dessous :

Ejemplo:

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

Il existe également DownloadData y DownloadFile les opérations sous WebClient instance. Ces opérations communes simplifient aussi le code de ce que nous ferions normalement avec HttpWebRequest . Utilisation de HttpWebRequest nous devons récupérer la réponse à notre demande, instancier StreamReader pour lire la réponse et enfin, convertir le résultat dans le type que nous attendons. Avec WebClient nous appelons simplement DownloadData, DownloadFile or DownloadString .

Cependant, gardez à l'esprit que WebClient.DownloadString ne tient pas compte de la encoding de la ressource que vous demandez. Ainsi, vous finirez probablement par recevoir des caractères bizarres si vous ne spécifiez pas d'encodage.

NOTE : Fondamentalement " WebClient prend quelques lignes de code par rapport à WebRequest "

0 votes

La classe WebClient utilise-t-elle la méthode Post/Get ? Veuillez fournir un lien pour décrire

0 votes

WebRequest nous permet d'ajouter le type de méthode de demande, c'est-à-dire Get/Post, avec une propriété METHOD, alors que WebClient n'a pas de fonctionnalité d'ajout de type de méthode.

1 votes

@SHEKHARSHETE J'ai été en mesure d'utiliser webClient.UploadData(url, "POST", bytes) pour spécifier la méthode (voir Documents MSDN ).

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X