Welchen Unterschied gibt es zwischen WebClient- und HTTPWebRequest-Klassen in .NET?


178

Welchen Unterschied gibt es zwischen den WebClientund den HttpWebRequestKlassen in .NET? Beide machen sehr ähnliche Dinge. Warum wurden sie nicht zu einer Klasse zusammengeführt (zu viele Methoden / Variablen usw. können ein Grund sein, aber es gibt andere Klassen in .NET, die gegen diese Regel verstoßen).

Vielen Dank.

Antworten:


242

WebClient ist eine übergeordnete Abstraktion, die auf HttpWebRequest aufbaut, um die häufigsten Aufgaben zu vereinfachen. Wenn Sie beispielsweise den Inhalt aus einer HttpWebResponse herausholen möchten, müssen Sie aus dem Antwortstrom lesen:

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();

Mit WebClient tun Sie einfach DownloadString:

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

Hinweis: Der usingKürze halber habe ich die Aussagen aus beiden Beispielen weggelassen. Sie sollten auf jeden Fall darauf achten, dass Ihre Webanforderungsobjekte ordnungsgemäß entsorgt werden.

Im Allgemeinen eignet sich WebClient für schnelle und schmutzige einfache Anforderungen, und HttpWebRequest eignet sich, wenn Sie mehr Kontrolle über die gesamte Anforderung benötigen.


34
Das Obige ist Tatsache, das Folgende ist Meinung: Beide sind schrecklich, weil HttpWebRequest kaputt ist. Es behandelt grundlegende Authentifizierungen falsch, erfordert seltsame Problemumgehungen wie ServicePointManager.Expect100Continue = false, macht andere nicht standardmäßige Dinge und hat viele Macken und Eigenheiten. Ich habe RestSharp gestartet, um diese Probleme zu beheben.
John Sheehan

4
Beachten Sie auch, dass WebClient eine Komponente ist, sodass Sie sie aus dem VS-Werkzeugfenster in Ihr Formular ziehen und dort ablegen können.
Feroze

1
Ich glaube, ich habe vor einiger Zeit versucht, httpwebrequest mit der Basisauthentifizierung zu verwenden. Dem kann ich zustimmen. Also hast du RestSharp gemacht? Cool!
GurdeepS

19
Jeder, der HttpClientdarauf stößt, wie ich es gerade
getan habe, merkt

3
WebClient implementiert IDisposable, daher sollten Sie dies in Betracht ziehenusing (WebClient client = new WebClient())
Eric

32

Auch WebClient hat keine Timeout-Eigenschaft. Und das ist das Problem, denn der Standardwert beträgt 100 Sekunden und das ist zu viel, um anzuzeigen, ob keine Internetverbindung besteht.

Problemumgehung für dieses Problem finden Sie hier https://stackoverflow.com/a/3052637/1303422


16
Die Frage war, was der Unterschied ist. Einer der Unterschiede besteht darin, dass WebClient keine Timeout-Eigenschaft hat, während HttpWebRequest dies tut.
Andriy F.

26

Ich weiß, dass es zu lang ist, um zu antworten, aber nur als Informationszweck für zukünftige Leser:

WebRequest

System.Object
    System.MarshalByRefObject
        System.Net.WebRequest

Das WebRequestist eine abstrakte Basisklasse. Sie verwenden es also nicht direkt. Sie verwenden es durch abgeleitete Klassen - HttpWebRequestund FileWebRequest.

Sie verwenden die Create-Methode von WebRequest, um eine Instanz von zu erstellen WebRequest. GetResponseStreamkehrt zurück data stream.

Es gibt auch FileWebRequestund FtpWebRequestKlassen, die inheritvon WebRequest. Normalerweise würden Sie verwenden , WebRequestum, na ja, eine Anfrage und die Rückkehr zu entweder konvertieren HttpWebRequest, FileWebRequestoderFtpWebRequest abhängig von Ihrer Anfrage . Unten ist ein Beispiel:

Beispiel:

var _request = (HttpWebRequest)WebRequest.Create("http://stackverflow.com");
var _response = (HttpWebResponse)_request.GetResponse();

WebClient

System.Object
        System.MarshalByRefObject
            System.ComponentModel.Component
                System.Net.WebClient

WebClientstellt allgemeine Vorgänge für sendingund receivingDaten von einer Ressource bereit, die durch a gekennzeichnet ist URI. Es ist einfach eine übergeordnete Abstraktion von HttpWebRequest. Diese "gemeinsamen Operationen" unterscheiden sich WebClientvon denen HttpWebRequest, wie auch im folgenden Beispiel gezeigt:

Beispiel:

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

Es gibt auch DownloadDataund DownloadFileOperationen unter WebClientInstanz. Diese allgemeinen Operationen vereinfachen auch den Code dessen, was wir normalerweise tun würden HttpWebRequest. Mit HttpWebRequestmüssen wir die Antwort auf unsere Anfrage erhalten, instanziieren StreamReader, um die Antwort zu lesen, und schließlich das Ergebnis in den von uns erwarteten Typ konvertieren. Mit WebClientrufen wir einfach anDownloadData, DownloadFile or DownloadString .

Beachten Sie jedoch, dass WebClient.DownloadStringdie encodingvon Ihnen angeforderte Ressource nicht berücksichtigt wird . Sie würden also wahrscheinlich seltsame Zeichen erhalten, wenn Sie nicht angeben und codieren.

HINWEIS: Grundsätzlich " WebClient benötigt im Vergleich zu Webrequest nur wenige Codezeilen "


Verwendet die WebClient-Klasse die Post / Get-Methode? Bitte geben Sie einen Link zur Beschreibung an
Kartiikeya

Mit WebRequest können wir den Typ der Anforderungsmethode hinzufügen, dh Get / Post mit einer Eigenschaft METHOD. Wobei als WebClient keine Methoden zum Hinzufügen von Methodentypen vorhanden sind.
SHEKHAR SHETE

1
@SHEKHARSHETE Ich konnte webClient.UploadData(url, "POST", bytes)die Methode angeben (siehe MSDN-Dokumente ).
Jeff B
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.