Wann wird WebClient vs. HttpClient vs. HttpWebRequest verwendet?

Sie haben drei verschiedene Möglichkeiten, um REST-APIs zu verwenden, wenn Sie in .NET Framework arbeiten: WebClient, HttpClient und HttpWebRequest. In diesem Beitrag werden diese drei Möglichkeiten untersucht, wie wir von der verwalteten Umgebung aus auf REST-APIs zugreifen können, ohne auf Bibliotheken von Drittanbietern zurückgreifen zu müssen. In den folgenden Abschnitten werde ich diese Ansätze anhand relevanter Codebeispiele veranschaulichen, um Ihnen ein besseres Verständnis der Konzepte zu ermöglichen.

Kurz gesagt, WebRequest - in seiner HTTP-spezifischen Implementierung HttpWebRequest - stellt die ursprüngliche Methode dar, HTTP-Anforderungen in .NET Framework zu verwenden. WebClient bietet einen einfachen, aber eingeschränkten Wrapper für HttpWebRequest. Und HttpClient ist die neue und verbesserte Methode zum Ausführen von HTTP-Anforderungen und -Postings, die mit .NET Framework 4.5 verfügbar ist.

Beginnen wir unsere Diskussion mit der abstrakten WebRequest-Klasse.

System.Net.WebRequest

Die System.Net.WebRequest-Klasse ist eine abstrakte Klasse. Daher müssen Sie eine HttpWebRequest oder FileWebRequest erstellen, um HTTP-Anforderungen mit dieser Klasse zu verarbeiten. Das folgende Codefragment zeigt, wie Sie mit WebRequest arbeiten können.

WebRequest webRequest = WebRequest.Create (uri);

webRequest.Credentials = CredentialCache.DefaultCredentials;

webRequest.Method;

HttpWebResponse webResponse = (HttpWebResponse) webRequest.GetResponse ();

System.Net.HttpWebRequest

WebRequest war die erste in .NET Framework bereitgestellte Klasse, die HTTP-Anforderungen verwendete. Es bietet Ihnen viel Flexibilität bei der Handhabung jedes einzelnen Aspekts der Anforderungs- und Antwortobjekte, ohne den Thread der Benutzeroberfläche zu blockieren. Mit dieser Klasse können Sie auf Header, Cookies, Protokolle und Zeitüberschreitungen zugreifen und mit diesen arbeiten, wenn Sie mit HTTP arbeiten. Das folgende Code-Snippet zeigt, wie HttpWebRequest verwendet werden kann.

HttpWebRequest http = HttpWebRequest) WebRequest.Create ("// localhost: 8900 / api / default");

WebResponse response = http.GetResponse ();

MemoryStream memoryStream = response.GetResponseStream ();

StreamReader streamReader = neuer StreamReader (memoryStream);

string data = streamReader.ReadToEnd ();

Die Dokumentation von Microsoft zu HttpWebRequest finden Sie hier. 

System.Net.WebClient

Die System.Net.WebClient-Klasse in .NET bietet zusätzlich zu HttpWebRequest eine allgemeine Abstraktion. WebClient ist nur ein Wrapper um HttpWebRequest und verwendet HttpWebRequest intern. Daher ist WebClient im Vergleich zu HttpWebRequest etwas langsam, erfordert jedoch, dass Sie viel weniger Code schreiben. Mit WebClient können Sie auf einfache Weise eine Verbindung zu HTTP-Diensten herstellen und mit diesen arbeiten. Es ist im Allgemeinen eine bessere Wahl als HttpWebRequest, es sei denn, Sie müssen die zusätzlichen Funktionen von HttpWebRequest nutzen. Das folgende Codefragment zeigt, wie Sie mit WebClient arbeiten können.

Zeichenfolgendaten = null;

using (var webClient = neuer WebClient ())

{

    data = webClient.DownloadString (url);

}}

System.Net.Http.HttpClient

HttpClient wurde in .NET Framework 4.5 eingeführt. Für Entwickler, die .NET 4.5 oder höher verwenden, ist dies die bevorzugte Methode, um HTTP-Anforderungen zu verwenden, es sei denn, Sie haben einen bestimmten Grund, es nicht zu verwenden. Im Wesentlichen kombiniert HttpClient die Flexibilität von HttpWebRequest und die Einfachheit von WebClient und bietet Ihnen das Beste aus beiden Welten.

Die HttpWebRequest-Klasse bietet viel Kontrolle über das Anforderungs- / Antwortobjekt. Sie sollten sich jedoch bewusst sein, dass HttpClient niemals als Ersatz für WebClient konzipiert wurde. Sie sollten HttpWebRequest anstelle von HttpClient verwenden, wenn Sie die zusätzlichen Funktionen benötigen, die HttpWebRequest bietet. Im Gegensatz zu WebClient bietet HttpClient keine Unterstützung für Fortschrittsberichte und benutzerdefinierte URI-Schemata. 

Obwohl HttpClient FTP nicht unterstützt, ist das Verspotten und Testen von HttpClient einfacher. Alle E / A-gebundenen Methoden in HttpClient sind asynchron, und Sie können dieselbe HttpClient-Instanz verwenden, um auch gleichzeitige Anforderungen zu stellen. Das folgende Codefragment zeigt, wie Sie mit HttpClient arbeiten können.

public async Task GetAuthorsAsync (Zeichenfolge uri)

{

    Autor author = null;

    HttpResponseMessage response = warte auf client.GetAsync (uri);

    if (response.IsSuccessStatusCode)

    {

        author = warte auf Antwort.Content.ReadAsAsync ();

    }}

    Rückgabe des Autors;

}}

Beachten Sie, dass HttpClient bei einem Fehler in der Antwort keinen Fehler auslöst. Vielmehr wird die IsSuccessStatusCodeEigenschaft auf false gesetzt. Wenn Sie eine Ausnahme auslösen möchten, wenn die IsSuccessStatusCodeEigenschaft false ist, können Sie die EnsureSuccessStatusCodeMethode in der Antwortinstanz wie unten gezeigt aufrufen .

response.EnsureSuccessStatusCode ();

HttpClient wurde so konzipiert, dass es einmal instanziiert und während des gesamten Lebenszyklus der Anwendung wiederverwendet wird. Sie sollten nicht für jede Anforderung, die Ihre Anwendung verarbeiten muss, eine neue HttpClient-Instanz erstellen. In diesem Fall können die verfügbaren Sockets durch starken Datenverkehr erschöpft sein und zu  SocketExceptionFehlern führen. Es wird empfohlen, eine einzelne gemeinsam genutzte HttpClient-Instanz zu erstellen.