Programavimas

Kada naudoti „WebClient“, palyginti su „HttpClient“ ir „HttpWebRequest“

Dirbdami „.NET Framework“ galite pasirinkti tris skirtingus REST API vartojimo pasirinkimus: „WebClient“, „HttpClient“ ir „HttpWebRequest“. Šiame įraše mes apžvelgsime šiuos tris būdus, kaip galime pasiekti REST API iš valdomos aplinkos, t.y., nesinaudodami trečiųjų šalių bibliotekomis. Tolesniuose skyriuose aš iliustruosiu šiuos metodus su atitinkamais kodų pavyzdžiais, kurie padės geriau suprasti sąvokas.

Trumpai tariant, „WebRequest“ - įgyvendinant HTTP, „HttpWebRequest“ - reiškia pirminį HTTP užklausų vartojimo būdą .NET Framework. „WebClient“ pateikia paprastą, bet ribotą „HttpWebRequest“ paketą. „HttpClient“ yra naujas ir patobulintas būdas atlikti HTTP užklausas ir pranešimus, pasiektas naudojant .NET Framework 4.5.

Pradėkime savo diskusiją su „WebRequest“ abstrakčia klase.

„System.Net.WebRequest“

„System.Net.WebRequest“ klasė yra abstrakti klasė. Taigi, norėdami naudoti HTTP užklausas naudodami šią klasę, turėsite sukurti „HttpWebRequest“ arba „FileWebRequest“. Šis kodo fragmentas parodo, kaip galite dirbti su „WebRequest“.

WebRequest webRequest = WebRequest.Create (uri);

webRequest.Credentials = CredentialCache.DefaultCredentials;

webRequest.Method;

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

„System.Net.HttpWebRequest“

„WebRequest“ buvo pirmoji klasė, pateikta „.NET Framework“, kuri vartojo HTTP užklausas. Tai suteikia jums daug lankstumo tvarkant kiekvieną užklausos ir atsakymo objektų aspektą, neužblokuojant vartotojo sąsajos gijos. Šią klasę galite naudoti norėdami pasiekti antraštes, slapukus, protokolus ir skirtąjį laiką dirbdami su HTTP. Šis kodo fragmentas parodo, kaip galima naudoti „HttpWebRequest“.

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

„WebResponse“ atsakymas = http.GetResponse ();

MemoryStream memoryStream = response.GetResponseStream ();

StreamReader streamReader = naujas StreamReader (memoryStream);

eilutės duomenys = streamReader.ReadToEnd ();

„Microsoft“ dokumentaciją apie „HttpWebRequest“ rasite čia.

„System.Net.WebClient“

.NET klasė „System.Net.WebClient“ suteikia aukšto lygio abstrakciją „HttpWebRequest“ viršuje. „WebClient“ yra tik „HttpWebRequest“ paketas, todėl „HttpWebRequest“ naudoja viduje. Taigi „WebClient“ yra šiek tiek lėtas, palyginti su „HttpWebRequest“, tačiau reikalauja, kad parašytumėte daug mažiau kodo. „WebClient“ galite naudoti paprastiems būdams prisijungti ir dirbti su HTTP paslaugomis. Paprastai tai yra geresnis pasirinkimas nei „HttpWebRequest“, nebent jums reikia pasinaudoti papildomomis „HttpWebRequest“ teikiamomis funkcijomis. Šis kodo fragmentas parodo, kaip galite dirbti su „WebClient“.

eilutės duomenys = null;

naudojant (var webClient = new WebClient ())

{

duomenys = webClient.DownloadString (url);

}

„System.Net.Http.HttpClient“

„HttpClient“ buvo pristatytas .NET Framework 4.5. Kūrėjams, naudojantiems .NET 4.5 ar naujesnę versiją, tai yra tinkamiausias būdas naudoti HTTP užklausas, nebent turite konkrečių priežasčių jos nenaudoti. Iš esmės „HttpClient“ sujungia „HttpWebRequest“ lankstumą ir „WebClient“ paprastumą, suteikdamas jums geriausią iš abiejų pasaulių.

„HttpWebRequest“ klasė suteikia daug galimybių valdyti užklausos / atsakymo objektą. Tačiau turėtumėte žinoti, kad „HttpClient“ niekada nebuvo sukurtas kaip „WebClient“ pakaitalas. Kai jums reikia papildomų funkcijų, kurias teikia „HttpWebRequest“, vietoj „HttpClient“ turėtumėte naudoti „HttpWebRequest“. Be to, skirtingai nei „WebClient“, „HttpClient“ trūksta ataskaitų apie pažangą ir pasirinktinių URI schemų palaikymo.

Nors „HttpClient“ nepalaiko FTP, tyčiotis ir išbandyti „HttpClient“ yra paprasčiau. Visi įvesties / išvesties susietieji „HttpClient“ metodai yra asinchroniški, ir jūs galite naudoti tą patį „HttpClient“ egzempliorių kartu pateikdami užklausas. Šis kodo fragmentas parodo, kaip galite dirbti su „HttpClient“.

viešoji asinchroninė užduotis „GetAuthorsAsync“ (eilutės uri)

{

Autorius autorius = null;

HttpResponseMessage response = laukti kliento. GetAsync (uri);

jei (response.IsSuccessStatusCode)

    {

autorius = laukti atsakymo.Content.ReadAsAsync ();

    }

grįžęs autorius;

}

Atkreipkite dėmesį, kad kai atsakyme yra klaida, „HttpClient“ nemeta klaidos. Veikiau tai nustato „IsSuccessStatusCode“ nuosavybė į melagingą. Jei norite mesti išimtį, jei „IsSuccessStatusCode“ ypatybė yra klaidinga, galite paskambinti į UžtikrinkiteSuccessStatusCode atsakymo egzemplioriaus metodas, kaip parodyta toliau.

response.EnsureSuccessStatusCode ();

„HttpClient“ buvo sukurtas taip, kad būtų vieną kartą iš karto sukurtas ir pakartotinai naudojamas per visą programos gyvavimo ciklą - neturėtumėte sukurti naujo „HttpClient“ egzemplioriaus kiekvienai užklausai, kurią reikia apdoroti jūsų programai. Jei tai padarysite, esamas lizdas gali išeikvoti intensyvus eismas, o tai gali sukelti„SocketException“ klaidos. Rekomenduojama sukurti vieną bendrą „HttpClient“ egzempliorių.