web-dev-qa-db-fra.com

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

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.

173
GurdeepS

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.

237
John Sheehan

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

30
Andriy F.

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"

25
SHEKHAR SHETE