Programmering

Hvornår skal man bruge WebClient vs. HttpClient vs. HttpWebRequest

Du har tre forskellige valg til forbrug af REST API'er, når du arbejder i .NET Framework: WebClient, HttpClient og HttpWebRequest. I dette indlæg vil vi se på disse tre måder, hvorpå vi kan få adgang til REST API'er fra det administrerede miljø, dvs. uden at ty til tredjepartsbiblioteker. I de efterfølgende afsnit vil jeg illustrere disse tilgange med relevante kodeeksempler for at hjælpe dig med at få en bedre forståelse af begreberne.

I en nøddeskal repræsenterer WebRequest - i sin HTTP-specifikke implementering, HttpWebRequest - den oprindelige måde at forbruge HTTP-anmodninger på i .NET Framework. WebClient giver en enkel, men begrænset indpakning omkring HttpWebRequest. Og HttpClient er den nye og forbedrede måde at udføre HTTP-anmodninger og indlæg på, når de er ankommet med .NET Framework 4.5.

Lad os starte vores diskussion med den abstrakte klasse WebRequest.

System.Net.WebRequest

System.Net.WebRequest-klassen er en abstrakt klasse. Således bliver du nødt til at oprette en HttpWebRequest eller FileWebRequest for at forbruge HTTP-anmodninger ved hjælp af denne klasse. Følgende kodestykke viser, hvordan du kan arbejde med WebRequest.

WebRequest webRequest = WebRequest.Create (uri);

webRequest.Credentials = CredentialCache.DefaultCredentials;

webRequest.Methode;

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

System.Net.HttpWebRequest

WebRequest var den første klasse, der blev leveret i .NET Framework til at forbruge HTTP-anmodninger. Det giver dig en masse fleksibilitet i håndteringen af ​​hvert eneste aspekt af anmodnings- og svarobjekterne uden at blokere brugergrænsefladetråden. Du kan bruge denne klasse til at få adgang til og arbejde med overskrifter, cookies, protokoller og timeouts, når du arbejder med HTTP. Følgende kodestykke illustrerer, hvordan HttpWebRequest kan bruges.

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

WebResponse svar = http.GetResponse ();

MemoryStream memoryStream = respons.GetResponseStream ();

StreamReader streamReader = ny StreamReader (memoryStream);

streng data = streamReader.ReadToEnd ();

Du kan finde Microsofts dokumentation om HttpWebRequest her.

System.Net.WebClient

System.Net.WebClient-klassen i .NET giver en abstraktion på højt niveau oven på HttpWebRequest. WebClient er bare en wrapper omkring HttpWebRequest, så bruger HttpWebRequest internt. WebClient er således lidt langsom sammenlignet med HttpWebRequest, men kræver, at du skriver meget mindre kode. Du kan bruge WebClient til enkle måder at oprette forbindelse til og arbejde med HTTP-tjenester. Det er generelt et bedre valg end HttpWebRequest, medmindre du har brug for at udnytte de ekstra funktioner, som HttpWebRequest giver. Følgende kodestykke viser, hvordan du kan arbejde med WebClient.

streng data = null;

ved hjælp af (var webClient = ny WebClient ())

{

data = webClient.DownloadString (url);

}

System.Net.Http.HttpClient

HttpClient blev introduceret i .NET Framework 4.5. For udviklere, der bruger .NET 4.5 eller nyere, er det den foretrukne måde at forbruge HTTP-anmodninger på, medmindre du har en bestemt grund til ikke at bruge den. I det væsentlige kombinerer HttpClient fleksibiliteten i HttpWebRequest og enkelheden ved WebClient, hvilket giver dig det bedste fra begge verdener.

HttpWebRequest-klassen giver meget kontrol over anmodnings- / svarobjektet. Du skal dog være opmærksom på, at HttpClient aldrig blev designet til at erstatte WebClient. Du skal bruge HttpWebRequest i stedet for HttpClient, når du har brug for de ekstra funktioner, som HttpWebRequest giver. Yderligere, i modsætning til WebClient, mangler HttpClient support til statusrapportering og brugerdefinerede URI-ordninger.

Selvom HttpClient ikke understøtter FTP, er det lettere at spotte og teste HttpClient. Alle I / O-bundne metoder i HttpClient er asynkrone, og du kan også bruge den samme HttpClient-forekomst til at stille samtidige anmodninger. Følgende kodestykke illustrerer, hvordan du kan arbejde med HttpClient.

offentlig async Opgave GetAuthorsAsync (streng uri)

{

Forfatterforfatter = null;

HttpResponseMessage respons = afventer client.GetAsync (uri);

hvis (respons.IsSuccessStatusCode)

    {

forfatter = afventer svar.Content.ReadAsAsync ();

    }

returnere forfatter;

}

Bemærk, at når der er en fejl i svaret, kaster HttpClient ikke en fejl. Snarere indstiller den IsSuccessStatusCode ejendom til falsk. Hvis du vil kaste en undtagelse, hvis IsSuccessStatusCode ejendom er falsk, kan du ringe til EnsureSuccessStatusCode metode på svarforekomsten som vist nedenfor.

respons.EnsureSuccessStatusCode ();

HttpClient blev designet til at blive instantieret en gang og genbrugt gennem applikationens livscyklus - du bør ikke oprette en ny HttpClient-instans til hver anmodning, som din applikation skal behandle. Hvis du gør det, kan de ledige stikkontakter blive opbrugt af tung trafik og resultere iSocketException fejl. Den anbefalede praksis er at oprette en enkelt, delt HttpClient-forekomst.