Kada koristiti WebClient u odnosu na HttpClient u odnosu na HttpWebRequest

Imate tri različita izbora za konzumiranje REST API-ja kada radite u .NET Framework: WebClient, HttpClient i HttpWebRequest. U ovom ćemo postu pogledati ova tri načina na koja možemo pristupiti REST API-ima iz upravljanog okruženja, tj. Bez pribjegavanja bibliotekama trećih strana. U sljedećim odjeljcima ilustrirat ću ove pristupe relevantnim primjerima koda koji će vam pomoći da bolje razumijete koncepte.

Ukratko, WebRequest - u svojoj HTTP-specifičnoj implementaciji, HttpWebRequest - predstavlja izvorni način trošenja HTTP zahtjeva u .NET Framework. WebClient pruža jednostavan, ali ograničen omot oko HttpWebRequest. A HttpClient je novi i poboljšani način izvođenja HTTP zahtjeva i postova, nakon što je stigao s .NET Framework 4.5.

Započnimo našu raspravu sa sažetkom klase WebRequest.

System.Net.WebRequest

Klasa System.Net.WebRequest je apstraktna klasa. Stoga ćete trebati stvoriti HttpWebRequest ili FileWebRequest za konzumiranje HTTP zahtjeva pomoću ove klase. Sljedeći isječak koda pokazuje kako možete raditi s WebRequestom.

WebRequest webRequest = WebRequest.Create (uri);

webRequest.Credentials = CredentialCache.DefaultCredentials;

webRequest.Method;

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

System.Net.HttpWebRequest

WebRequest je prva klasa u .NET Framework koja je konzumirala HTTP zahtjeve. Pruža vam veliku fleksibilnost u rukovanju svim aspektima objekata zahtjeva i odgovora, bez blokiranja niti korisničkog sučelja. Ovu klasu možete koristiti za pristup i rad sa zaglavljima, kolačićima, protokolima i vremenskim ograničenjima kada radite s HTTP-om. Sljedeći isječak koda ilustrira kako se HttpWebRequest može koristiti.

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

WebResponse odgovor = http.GetResponse ();

MemoryStream memoryStream = response.GetResponseStream ();

StreamReader streamReader = novi StreamReader (memoryStream);

niz podataka = streamReader.ReadToEnd ();

Microsoftovu dokumentaciju o HttpWebRequestu možete pronaći ovdje. 

System.Net.WebClient

Klasa System.Net.WebClient u .NET-u pruža apstrakciju na visokoj razini povrh HttpWebRequest-a. WebClient je samo omot oko HttpWebRequest, pa interno koristi HttpWebRequest. Stoga je WebClient malo sporiji u usporedbi s HttpWebRequestom, ali zahtijeva da napišete mnogo manje koda. WebClient možete koristiti za jednostavne načine povezivanja i rada s HTTP uslugama. Općenito je bolji izbor od HttpWebRequest, osim ako ne trebate iskoristiti dodatne značajke koje HttpWebRequest nudi. Sljedeći isječak koda pokazuje kako možete raditi s WebClientom.

niz podataka = null;

pomoću (var webClient = new WebClient ())

{

    data = webClient.DownloadString (url);

}

System.Net.Http.HttpClient

HttpClient je predstavljen u .NET Framework 4.5. Za programere koji koriste .NET 4.5 ili novije verzije, preferirani je način konzumiranja HTTP zahtjeva, osim ako nemate određeni razlog da ga ne koristite. U osnovi, HttpClient kombinira fleksibilnost HttpWebRequest-a i jednostavnost WebClienta, pružajući vam najbolje iz oba svijeta.

Klasa HttpWebRequest pruža veliku kontrolu nad objektom zahtjeva / odgovora. Međutim, trebali biste biti svjesni da HttpClient nikada nije zamišljen kao zamjena za WebClient. Trebali biste koristiti HttpWebRequest umjesto HttpClient kad god su vam potrebne dodatne značajke koje HttpWebRequest nudi. Nadalje, za razliku od WebClienta, HttpClientu nedostaje podrška za izvještavanje o napretku i prilagođene URI sheme. 

Iako HttpClient ne podržava FTP, ruganje i testiranje HttpClienta je lakše. Sve metode I / O vezane u HttpClientu su asinkrone, a istu HttpClient instancu možete koristiti i za istodobne zahtjeve. Sljedeći isječak koda ilustrira kako možete raditi s HttpClientom.

javni async zadatak GetAuthorsAsync (string uri)

{

    Autor autor = null;

    HttpResponseMessage odgovor = čeka klijenta.GetAsync (uri);

    ako (response.IsSuccessStatusCode)

    {

        autor = čeka odgovor.Content.ReadAsAsync ();

    }

    povratak autor;

}

Imajte na umu da kada postoji pogreška u odgovoru, HttpClient neće izbaciti pogrešku. Umjesto toga, IsSuccessStatusCodesvojstvo postavlja na false. Ako želite dodati iznimku ako je IsSuccessStatusCodesvojstvo false, možete uputiti poziv EnsureSuccessStatusCodemetodi na instanci odgovora kao što je prikazano u nastavku.

response.EnsureSuccessStatusCode ();

HttpClient je dizajniran za instanciju jednom i ponovnu upotrebu tijekom životnog ciklusa aplikacije - ne biste trebali stvarati novu instancu HttpClient za svaki zahtjev koji vaša aplikacija treba obraditi. Ako to učinite, dostupne utičnice mogu se iscrpiti zbog gustog prometa, što rezultira  SocketExceptionpogreškama. Preporučena praksa je stvaranje jedinstvene, dijeljene instance HttpClient.