Kiedy używać WebClient, HttpClient, a kiedy HttpWebRequest

Masz trzy różne możliwości korzystania z interfejsów API REST podczas pracy w środowisku .NET Framework: WebClient, HttpClient i HttpWebRequest. W tym poście przyjrzymy się tym trzem sposobom uzyskania dostępu do interfejsów API REST z poziomu zarządzanego środowiska, tj. Bez uciekania się do bibliotek innych firm. W kolejnych sekcjach zilustruję te podejścia odpowiednimi przykładami kodu, aby pomóc Ci lepiej zrozumieć pojęcia.

W skrócie, WebRequest - w swojej implementacji specyficznej dla HTTP, HttpWebRequest - reprezentuje oryginalny sposób obsługi żądań HTTP w .NET Framework. WebClient zapewnia prostą, ale ograniczoną otokę wokół HttpWebRequest. HttpClient to nowy i ulepszony sposób wykonywania żądań i postów HTTP, który pojawił się wraz z .NET Framework 4.5.

Zacznijmy naszą dyskusję od klasy abstrakcyjnej WebRequest.

System.Net.WebRequest

Klasa System.Net.WebRequest jest klasą abstrakcyjną. Dlatego musisz utworzyć HttpWebRequest lub FileWebRequest, aby korzystać z żądań HTTP przy użyciu tej klasy. Poniższy fragment kodu pokazuje, jak możesz pracować z WebRequest.

WebRequest webRequest = WebRequest.Create (uri);

webRequest.Credentials = CredentialCache.DefaultCredentials;

webRequest.Method;

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

System.Net.HttpWebRequest

WebRequest był pierwszą klasą udostępnioną w .NET Framework do obsługi żądań HTTP. Zapewnia dużą elastyczność w obsłudze każdego aspektu obiektów żądań i odpowiedzi bez blokowania wątku interfejsu użytkownika. Możesz używać tej klasy do uzyskiwania dostępu i pracy z nagłówkami, plikami cookie, protokołami i limitami czasu podczas pracy z protokołem HTTP. Poniższy fragment kodu ilustruje, jak można użyć HttpWebRequest.

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

Odpowiedź WebResponse = http.GetResponse ();

MemoryStream memoryStream = response.GetResponseStream ();

StreamReader streamReader = nowy StreamReader (memoryStream);

string data = streamReader.ReadToEnd ();

Dokumentację Microsoftu na HttpWebRequest można znaleźć tutaj. 

System.Net.WebClient

Klasa System.Net.WebClient w .NET zapewnia abstrakcję wysokiego poziomu na szczycie HttpWebRequest. WebClient jest tylko otoką wokół HttpWebRequest, więc wewnętrznie używa HttpWebRequest. W związku z tym WebClient jest nieco powolny w porównaniu do HttpWebRequest, ale wymaga napisania znacznie mniej kodu. Za pomocą WebClient można w prosty sposób łączyć się i pracować z usługami HTTP. Zwykle jest to lepszy wybór niż HttpWebRequest, chyba że musisz wykorzystać dodatkowe funkcje, które zapewnia HttpWebRequest. Poniższy fragment kodu pokazuje, jak możesz pracować z WebClient.

string data = null;

using (var webClient = new WebClient ())

{

    data = webClient.DownloadString (url);

}

System.Net.Http.HttpClient

HttpClient został wprowadzony w .NET Framework 4.5. Dla programistów korzystających z .NET 4.5 lub nowszego jest to preferowany sposób korzystania z żądań HTTP, chyba że masz konkretny powód, aby go nie używać. W istocie HttpClient łączy w sobie elastyczność HttpWebRequest i prostotę WebClient, dając Ci to, co najlepsze z obu światów.

Klasa HttpWebRequest zapewnia dużą kontrolę nad obiektem żądania / odpowiedzi. Należy jednak pamiętać, że HttpClient nigdy nie został zaprojektowany jako zamiennik dla WebClient. Należy używać HttpWebRequest zamiast HttpClient zawsze, gdy potrzebujesz dodatkowych funkcji, które zapewnia HttpWebRequest. Ponadto, w przeciwieństwie do WebClient, HttpClient nie obsługuje raportowania postępu i niestandardowych schematów URI. 

Chociaż HttpClient nie obsługuje protokołu FTP, mockowanie i testowanie HttpClient jest łatwiejsze. Wszystkie metody powiązane z we / wy w HttpClient są asynchroniczne i można użyć tego samego wystąpienia HttpClient do wykonywania współbieżnych żądań. Poniższy fragment kodu ilustruje, jak możesz pracować z HttpClient.

publiczne zadanie asynchroniczne GetAuthorsAsync (ciąg uri)

{

    Autor autor = null;

    Odpowiedź HttpResponseMessage = czekaj na klienta.GetAsync (uri);

    if (response.IsSuccessStatusCode)

    {

        autor = czekaj na odpowiedź.Content.ReadAsAsync ();

    }

    autor powrotu;

}

Zwróć uwagę, że gdy w odpowiedzi wystąpi błąd, HttpClient nie zgłasza błędu. Zamiast tego ustawia IsSuccessStatusCodewłaściwość na false. Jeśli chcesz IsSuccessStatusCodezgłosić wyjątek, jeśli właściwość ma wartość false, możesz wywołać EnsureSuccessStatusCodemetodę w wystąpieniu odpowiedzi, jak pokazano poniżej.

response.EnsureSuccessStatusCode ();

HttpClient został zaprojektowany do jednorazowego utworzenia wystąpienia i ponownego użycia w całym cyklu życia aplikacji - nie należy tworzyć nowego wystąpienia HttpClient dla każdego żądania, które aplikacja musi przetworzyć. Jeśli to zrobisz, dostępne gniazda mogą zostać wyczerpane przez duży ruch, powodując  SocketExceptionbłędy. Zalecaną praktyką jest utworzenie pojedynczego, współużytkowanego wystąpienia HttpClient.