Programmering

Når skal du bruke WebClient vs. HttpClient vs. HttpWebRequest

Du har tre forskjellige valg for å konsumere REST APIer når du arbeider i .NET Framework: WebClient, HttpClient og HttpWebRequest. I dette innlegget vil vi se på disse tre måtene vi kan få tilgang til REST APIer fra det administrerte miljøet, dvs. uten å ty til tredjepartsbiblioteker. I avsnittene som følger vil jeg illustrere disse tilnærmingene med relevante kodeeksempler for å hjelpe deg med å få en bedre forståelse av konseptene.

I et nøtteskall representerer WebRequest — i sin HTTP-spesifikke implementering, HttpWebRequest — den originale måten å konsumere HTTP-forespørsler i .NET Framework. WebClient gir en enkel, men begrenset innpakning rundt HttpWebRequest. Og HttpClient er den nye og forbedrede måten å gjøre HTTP-forespørsler og innlegg på, etter å ha kommet med .NET Framework 4.5.

La oss starte diskusjonen med WebRequest-abstraktklassen.

System.Net.WebRequest

System.Net.WebRequest-klassen er en abstrakt klasse. Dermed må du opprette en HttpWebRequest eller FileWebRequest for å konsumere HTTP-forespørsler ved bruk av denne klassen. Følgende kodebit viser hvordan du kan jobbe med WebRequest.

WebRequest webRequest = WebRequest.Create (uri);

webRequest.Credentials = CredentialCache.DefaultCredentials;

webRequest.Method;

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

System.Net.HttpWebRequest

WebRequest var den første klassen som ble levert i .NET Framework for å konsumere HTTP-forespørsler. Det gir deg mye fleksibilitet i å håndtere hvert eneste aspekt av forespørselen og responsobjektene, uten å blokkere brukergrensesnitttråden. Du kan bruke denne klassen til å få tilgang til og jobbe med overskrifter, informasjonskapsler, protokoller og tidsavbrudd når du arbeider med HTTP. Følgende kodebit illustrerer hvordan HttpWebRequest kan brukes.

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

WebResponse respons = http.GetResponse ();

MemoryStream memoryStream = respons.GetResponseStream ();

StreamReader streamReader = ny StreamReader (memoryStream);

strengdata = streamReader.ReadToEnd ();

Du finner Microsofts dokumentasjon på HttpWebRequest her.

System.Net.WebClient

System.Net.WebClient-klassen i .NET gir en abstraksjon på høyt nivå på toppen av HttpWebRequest. WebClient er bare en wrapper rundt HttpWebRequest, så bruker HttpWebRequest internt. Dermed er WebClient litt treg i forhold til HttpWebRequest, men krever at du skriver mye mindre kode. Du kan bruke WebClient for enkle måter å koble til og jobbe med HTTP-tjenester på. Det er generelt et bedre valg enn HttpWebRequest med mindre du trenger å utnytte tilleggsfunksjonene som HttpWebRequest tilbyr. Følgende kodebit viser hvordan du kan jobbe med WebClient.

strengdata = null;

bruker (var webClient = new WebClient ())

{

data = webClient.DownloadString (url);

}

System.Net.Http.HttpClient

HttpClient ble introdusert i .NET Framework 4.5. For utviklere som bruker .NET 4.5 eller nyere, er det den foretrukne måten å konsumere HTTP-forespørsler med mindre du har en spesifikk grunn til ikke å bruke den. I hovedsak kombinerer HttpClient fleksibiliteten til HttpWebRequest og enkelheten til WebClient, noe som gir deg det beste fra begge verdener.

HttpWebRequest-klassen gir mye kontroll over forespørselen / svarobjektet. Du bør imidlertid være oppmerksom på at HttpClient aldri ble designet for å erstatte WebClient. Du bør bruke HttpWebRequest i stedet for HttpClient når du trenger tilleggsfunksjonene som HttpWebRequest tilbyr. Videre, i motsetning til WebClient, mangler HttpClient støtte for fremdriftsrapportering og tilpassede URI-ordninger.

Selv om HttpClient ikke støtter FTP, er det lettere å spotte og teste HttpClient. Alle I / O-bundne metoder i HttpClient er asynkrone, og du kan også bruke den samme HttpClient-forekomsten for å gjøre samtidige forespørsler. Følgende kodebit illustrerer hvordan du kan jobbe med HttpClient.

offentlig asynk Oppgave GetAuthorsAsync (streng uri)

{

Forfatterforfatter = null;

HttpResponseMessage respons = venter på client.GetAsync (uri);

if (respons.IsSuccessStatusCode)

    {

forfatter = avventer respons.Content.ReadAsAsync ();

    }

retur forfatter;

}

Vær oppmerksom på at når det er en feil i svaret, kaster HttpClient ikke feil. Snarere setter den IsSuccessStatusCode eiendom til falsk. Hvis du vil kaste et unntak hvis IsSuccessStatusCode eiendommen er falsk, kan du ringe til EnsureSuccessStatusCode metode på responsforekomsten som vist nedenfor.

respons.EnsureSuccessStatusCode ();

HttpClient ble designet for å bli instantiert en gang og gjenbrukt gjennom hele programmets livssyklus - du bør ikke opprette en ny HttpClient-forekomst for hver forespørsel som applikasjonen din trenger å behandle. Hvis du gjør det, kan de tilgjengelige stikkontaktene bli utmattet av tung trafikk, noe som kan føre tilSocketException feil. Den anbefalte fremgangsmåten er å opprette en enkelt, delt HttpClient-forekomst.

$config[zx-auto] not found$config[zx-overlay] not found