Quelle différence y a-t-il entre les classes WebClient
et HttpWebRequest
dans .NET? Ils font tous deux des choses très similaires. En fait, pourquoi n’ont-ils pas été fusionnés dans une classe (trop de méthodes/variables, etc. peuvent en être une des raisons, mais il existe d’autres classes dans .NET qui enfreignent cette règle).
Merci.
WebClient est une abstraction de niveau supérieur 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 dans le 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 abrégé les déclarations using
des deux exemples pour des raisons de concision. Vous devez absolument prendre le soin de disposer correctement vos objets de requête Web.
En général, WebClient convient aux requêtes simples rapides et compliquées et HttpWebRequest est utile lorsque vous avez besoin d'un contrôle accru sur l'ensemble de la demande.
De plus, WebClient n'a pas de propriété de délai d'expiration. Et c’est le problème, car la valeur par défaut est 100 secondes et c’est trop pour indiquer qu’il n’ya pas de connexion Internet.
La 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 à titre d'information pour les futurs lecteurs:
WebRequest
System.Object
System.MarshalByRefObject
System.Net.WebRequest
WebRequest
est une classe de base abstraite. Donc, vous ne l'utilisez pas directement. Vous l'utilisez dans ses classes dérivées - HttpWebRequest
et FileWebRequest
.
Vous utilisez la méthode Create 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, enfin, faire une demande et convertir le retour en HttpWebRequest
, FileWebRequest
ou FtpWebRequest
, dépend de votre demande. Ci-dessous 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 communes aux sending
et receiving
données d'une ressource identifiée par un URI
. Simplement, il s’agit d’une abstraction de niveau supérieur de HttpWebRequest
. C’est 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
dans 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 le 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 finirez probablement par recevoir des caractères étranges si vous ne spécifiez pas et n’encodez pas.
NOTE: En gros "WebClient prend quelques lignes de code par rapport à Webrequest"