it-swarm.com.de

Welcher Unterschied besteht zwischen den Klassen WebClient und HTTPWebRequest in .NET?

Welcher Unterschied besteht zwischen den Klassen WebClient und HttpWebRequest in .NET? Sie machen beide 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 diese Regel brechen.).

Vielen Dank.

173
GurdeepS

WebClient ist eine übergeordnete Abstraktion, die auf HttpWebRequest aufbaut, um die häufigsten Aufgaben zu vereinfachen. Wenn Sie beispielsweise den Inhalt aus einer HttpWebResponse abrufen möchten, müssen Sie Folgendes aus dem Antwortdatenstrom 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 machen Sie einfach DownloadString:

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

Hinweis: Aus Gründen der Kürze habe ich die using -Anweisungen aus beiden Beispielen weggelassen. Sie sollten auf jeden Fall darauf achten, Ihre Webanforderungsobjekte ordnungsgemäß zu entsorgen.

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.

237
John Sheehan

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

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

30
Andriy F.

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

Die WebRequest ist eine abstrakte Basisklasse. Sie verwenden es also nicht direkt. Sie verwenden es durch abgeleitete Klassen - HttpWebRequest und FileWebRequest.

Mit der Create-Methode von WebRequest erstellen Sie eine Instanz von WebRequest. GetResponseStream gibt data stream zurück.

Es gibt auch Klassen FileWebRequest und FtpWebRequest, die inherit aus WebRequest stammen. Normalerweise würden Sie WebRequest verwenden, um eine Anfrage zu stellen und die Rückgabe in HttpWebRequest, FileWebRequest oder FtpWebRequest zu konvertieren, 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

WebClient bietet allgemeine Operationen für sending und receiving Daten aus einer Ressource, die durch ein URI gekennzeichnet ist. Es ist einfach eine übergeordnete Abstraktion von HttpWebRequest. Diese ‘gemeinsamen Operationen’ unterscheiden WebClient von HttpWebRequest, wie auch im folgenden Beispiel gezeigt:

Beispiel:

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

Es gibt auch DownloadData- und DownloadFile -Operationen unter der Instanz WebClient. Diese allgemeinen Operationen vereinfachen auch den Code dessen, was wir normalerweise mit HttpWebRequest tun würden. Mit HttpWebRequest müssen wir die Antwort auf unsere Anfrage erhalten, StreamReader instanziieren, um die Antwort zu lesen und schließlich das Ergebnis in den von uns erwarteten Typ zu konvertieren. Mit WebClient rufen wir einfach DownloadData, DownloadFile or DownloadString Auf.

Beachten Sie jedoch, dass WebClient.DownloadString Das encoding der angeforderten Ressource nicht berücksichtigt. Daher würden Sie wahrscheinlich komische Zeichen erhalten, wenn Sie keine Angabe und Kodierung machen.

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

25
SHEKHAR SHETE