WebClient vs. HttpWebRequest / HttpWebResponse

132

Es scheint mir, dass das meiste, was mit erreicht werden HttpWebRequest/Responsekann, auch mit der WebClientKlasse erreicht werden kann. Ich habe irgendwo gelesen, für WebClientwas ein High-Level-Wrapper ist WebRequest/Response.
Bisher kann ich nichts sehen, was mit HttpWebRequest/Responsedem nicht erreicht werden kann WebClient, noch mit HttpWebRequest / Response, das Ihnen eine "feinkörnigere" Kontrolle gibt.

Wann und wann soll ich WebClient verwenden HttpWebRequest/Response? (Offensichtlich HttpWebRequest/Responsesind HTTP-spezifisch.)

Wenn ich HttpWebRequest/Responsedann ein niedrigeres Level habe WebClient, was kann ich damit erreichen, was HttpWebRequest/Responseich nicht erreichen kann WebClient?

Dan
quelle

Antworten:

87

Mit können HttpWebRequestSie die Anforderung besser steuern. Sie können Cookies, Header, Protokolle usw. festlegen. In der Antwort können Sie auch die Cookies und Header abrufen

Thomas Levesque
quelle
14
Thomas, immer noch nicht überzeugt ... WebClient hat eine Headers-Eigenschaft. Sie können das Cookie wie folgt abrufen: String cookie = webClient.ResponseHeaders ("Set-Cookie") und setzen es: webClient.Headers.Add ("Cookie", " CommunityServer-UserCookie… ");
Dan
14
Mit HttpWebRequest können Sie ein Timeout definieren. In WebClient ist das unmöglich.
Ripper234
14
@ ripper234, eigentlich ist es ist möglich: Sie erben WebClient haben gerade und außer Kraft setzen GetWebRequest die HttpWebRequest anpassen
Thomas Levesque
15
@ThomasLevesque Wenn Sie Webclient erben und die Webanforderung überschreiben, scheint es sinnlos, den Webclient zu verwenden ...
Hagai L
5
@ HagaiL, ich bin anderer Meinung ... Sie müssen nicht die gesamte Anfrage manuell erstellen, Sie können sie verwenden base.GetWebRequest, um sie zu erstellen und dann genau das anzupassen, was Sie wollen
Thomas Levesque
54

HttpWebRequest macht viel mehr Dinge verfügbar, die Ihnen eine fein abgestimmte Protokollsteuerung ermöglichen, z. B.: ob Sie Keep-Alive verwenden möchten, welchen Verbindungspool Sie verwenden möchten, ob Schreibvorgänge gepuffert werden sollen oder nicht usw.

WebClientmacht nicht alle WebClientverfügbar (obwohl Sie eine Unterklasse von dem zugrunde liegenden Anforderungsobjekt erstellen und auf dieses zugreifen können).

WebClientist für Situationen nützlich , wenn Sie nur eine Operation zu tun: (zB POST / GET / Form - Upload) und können nicht gestört werden , zu erstellen und zu verwalten , die HttpWebRequest, RequestStream, HttpWebResponse, und Antwortstream.

Feroze
quelle
13
Es gibt noch eine Sache, die ich vergessen habe zu erwähnen. WebClient ist ein Komponentenobjekt, HttpWebRequest hingegen nicht. Was bedeutet das? Wenn Sie VisualStudio zum Erstellen einer GUI-App verwenden, können Sie die WebClient-Komponente per Drag & Drop auf Ihr Formular ziehen und damit Anforderungen an HTTP / FTP-Server usw. senden.
Feroze
14

Aus Tim Heuers Blog - http://timheuer.com/blog/archive/2008/03/14/calling-web-services-with-silverlight-2.aspx

Stattdessen möchten Sie in Silverlight WebClient oder HttpWebRequest verwenden. Was ist der Unterschied? Hier ist die Timheuer-Version. WebClient ist eine einfachere Implementierung, die GET-Anforderungen sehr einfach erledigt und einen Antwortstrom erhält. HttpWebRequest eignet sich hervorragend, wenn Sie eine etwas genauere Kontrolle über die Anforderung benötigen, Header oder andere Anpassungen senden müssen.

Benjamin Cox
quelle
7
WebClient erlaubt auch POST mit UploadString, UploadData und UploadFile
Thomas Levesque
@ThomasLevesque Gibt es heute eine neuere Version der Klassen? Ich sehe, dass diese Diskussion ein bisschen ist, hmm ... gealtert ...
Konrad Viltersten
@KonradViltersten, ich glaube nicht, dass sich an der WebClient-Klasse viel geändert hat. Für neue Apps empfehle ich stattdessen die Verwendung von HttpClient, das ebenfalls sehr einfach zu bedienen und viel flexibler ist.
Thomas Levesque
1
@ThomasLevesque Richtig, das war der, über den ich nachgedacht habe. Ich erinnerte mich an http als Unterschied im Klassennamen und wurde von Http ... Teil irregeführt . Jetzt bin ich wieder auf dem richtigen Weg. Vielen Dank!
Konrad Viltersten
12

Die WebClient- Klasse wird auf dem Benutzeroberflächenthread ausgeführt, sodass die Benutzeroberfläche nicht reagiert , während Daten aus dem Internet heruntergeladen werden. Andererseits blockiert die HttpWebRequest- Klasse den Benutzeroberflächenthread nicht und Ihre Anwendung reagiert. In Apps, in denen eine große Datenmenge aus dem Internet heruntergeladen werden soll oder auf die nur langsam zugegriffen werden kann, sollten Sie die HttpWebRequest-Klasse verwenden. In allen anderen Fällen sollten Sie die WebClient-Klasse verwenden.

Baaziz
quelle
1
Das Gegenteil ist bei WP7 der Fall. HttpWebRequest marshals zurück zum UI-Thread in Mango, was mir im Moment kein Ende der Trauer bereitet. Grrr
Cameron MacFarland
6
WebClient unterstützt auch asynchrone Methoden.
CyberMonk
6

Ein weiterer Nachteil von WebClientist, dass der HTTP ContentType- charsetWert ignoriert wird , wenn Sie ihn zum Abrufen des Antworttextes verwenden. Sie müssen die Codierung explizit über die EncodingEigenschaft festlegen .

Sam
quelle
Das ist ein guter Punkt; und es ist nicht nur eine Frage der Einstellung von Encoding- man kann nicht wissen , die Codierung erst nach der Anforderung, so dass der WebClient api macht es sehr unwahrscheinlich , dass Sie sind in der Lage sein , um richtig einen String in einer unbekannten Codierung herunterladen.
Eamon Nerbonne
5

Eine weitere Sache, mit der HttpWebrquest die Komprimierung ermöglicht, aber die Net.WebClient-Klasse unterstützt keine HTTP-Komprimierung

Zain Ali
quelle
3
Wie bei allen anderen Beispielen für WebClient, bei denen einige Details ausgeblendet werden, kann dies durch Unterklassen von WebClient und Überschreiben behoben werden GetWebRequest. In diesem Fall optimierenHttpWebRequest.AutomaticDecompressiong Sie einfach die zugrunde liegende Eigenschaft .
Patridge
5

Die "HtttpWebRequest" ist in .NET 4.5 veraltet. Diese Klasse ist nur noch intern.

Julio Spader
quelle
2
Tatsächlich. Verwenden Sie WebRequeststattdessen.
Seidenfeuer
2
Die Klasse ist nicht veraltet, die Konstruktoren sind. Und die Klasse ist nicht intern, sie ist immer noch öffentlich.
user247702
2

Ein Beispiel: Das Posten von Daten und das Zurückholen verarbeiteter Daten in einem Anforderungs- / Antwortzyklus scheint mit WebClient unmöglich zu sein, aber Sie können dies mit HtttpWebRequest tun.

synergetisch
quelle
2
Verwenden Sie einfach WebClient.UploadString oder WebClient.UploadData, um einen POST durchzuführen und eine Antwortzeichenfolge oder ein Byte-Array zurückzugewinnen.
Samjudson
2
Zur Verdeutlichung ist der Rückgabewert des UploadString eine Zeichenfolge und der Rückgabewert der UploadData-Methode ein Byte-Array.
Norman H