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