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

Quelle différence y a-t-il entre les classes WebClient et HttpWebRequest 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 rompent cette règle).

Merci.

159
demandé sur abatishchev 2011-02-14 05:16:29

3 réponses

WebClient est une abstraction de niveau supérieur construite au-dessus de HttpWebRequest pour simplifier les tâches les plus courantes. Par exemple, si vous voulez 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, vous faites juste DownloadString:

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

Note: j'ai omis les instructions using des deux exemples par souci de concision. Vous devez absolument prendre soin de disposer correctement vos objets de requête web.

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

219
répondu John Sheehan 2011-02-14 02:32:12

WebClient N'a pas non plus 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.

Solution de Contournement pour ce problème est ici https://stackoverflow.com/a/3052637/1303422

25
répondu Andriy F. 2017-05-23 10:31:30

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

WebRequest

System.Object
    System.MarshalByRefObject
        System.Net.WebRequest

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

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

Il y a aussi FileWebRequest et FtpWebRequest classes qui inherit de WebRequest. Normalement, vous utiliseriez WebRequest pour, ainsi, faire une demande et de convertir le retour soit HttpWebRequest, FileWebRequest ou FtpWebRequest, dépendent de votre demande. Voici un exemple:

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

WebClient fournit des opérations sending et receiving données à partir d'une ressource identifiée par un URI. Simplement, c'est une abstraction de niveau supérieur de HttpWebRequest. Ces "opérations communes" sont ce qui différencie WebClient de HttpWebRequest, comme le montre également l'exemple ci-dessous:

Exemple:

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

Il existe également des opérations DownloadData et DownloadFile sous l'instance WebClient. Ces opérations courantes simplifient également le code de ce que nous ferions normalement avec HttpWebRequest. En utilisant HttpWebRequest, nous devons obtenir la réponse de notre requête, instancier StreamReader pour lire la réponse et enfin, convertir le résultat en n'importe quel type que nous attendons. Avec WebClient, nous appelons simplement DownloadData, DownloadFile or DownloadString.

Cependant, gardez à l'esprit que WebClient.DownloadString ne considère pas le encoding de 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.

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

24
répondu SHEKHAR SHETE 2017-03-29 08:52:32