Кога да се използва WebClient срещу HttpClient срещу HttpWebRequest

Имате три различни възможности за консумация на REST API при работа в .NET Framework: WebClient, HttpClient и HttpWebRequest. В тази публикация ще разгледаме тези три начина, по които можем да получим достъп до REST API от управляваната среда, т.е. без да прибягваме до библиотеки на трети страни. В следващите раздели ще илюстрирам тези подходи със съответни примери за кодове, за да ви помогна да разберете по-добре концепциите.

Накратко, WebRequest - в специфичната си HTTP реализация, HttpWebRequest - представлява оригиналния начин за консумиране на HTTP заявки в .NET Framework. WebClient предоставя проста, но ограничена обвивка около HttpWebRequest. А HttpClient е новият и подобрен начин за извършване на HTTP заявки и публикации, пристигнал с .NET Framework 4.5.

Нека започнем нашата дискусия с абстрактния клас WebRequest.

System.Net.WebRequest

Класът System.Net.WebRequest е абстрактен клас. По този начин ще трябва да създадете HttpWebRequest или FileWebRequest, за да консумирате HTTP заявки, използвайки този клас. Следният кодов фрагмент показва как можете да работите с WebRequest.

WebRequest webRequest = WebRequest.Create (uri);

webRequest.Credentials = CredentialCache.DefaultCredentials;

webRequest.Method;

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

System.Net.HttpWebRequest

WebRequest беше първият клас, предоставен в .NET Framework, който консумира HTTP заявки. Това ви дава голяма гъвкавост при обработката на всеки аспект на обектите за заявки и отговори, без да блокирате нишката на потребителския интерфейс. Можете да използвате този клас за достъп и работа с заглавки, бисквитки, протоколи и изчаквания при работа с HTTP. Следният кодов фрагмент илюстрира как може да се използва HttpWebRequest.

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

WebResponse отговор = http.GetResponse ();

MemoryStream memoryStream = response.GetResponseStream ();

StreamReader streamReader = нов StreamReader (memoryStream);

низ данни = streamReader.ReadToEnd ();

Можете да намерите документацията на Microsoft за HttpWebRequest тук. 

System.Net.WebClient

Класът System.Net.WebClient в .NET осигурява абстракция на високо ниво върху HttpWebRequest. WebClient е само обвивка около HttpWebRequest, така че използва HttpWebRequest вътрешно. По този начин WebClient е малко по-бавен в сравнение с HttpWebRequest, но изисква от вас да пишете много по-малко код. Можете да използвате WebClient за лесни начини за свързване и работа с HTTP услуги. Обикновено това е по-добър избор от HttpWebRequest, освен ако не е необходимо да използвате допълнителните функции, които HttpWebRequest предоставя. Следният кодов фрагмент показва как можете да работите с WebClient.

низ данни = нула;

използвайки (var webClient = new WebClient ())

{

    data = webClient.DownloadString (url);

}

System.Net.Http.HttpClient

HttpClient е въведен в .NET Framework 4.5. За разработчици, използващи .NET 4.5 или по-нова версия, това е предпочитаният начин да се използват HTTP заявки, освен ако нямате конкретна причина да не го използвате. По същество HttpClient съчетава гъвкавостта на HttpWebRequest и простотата на WebClient, като ви дава най-доброто от двата свята.

Класът HttpWebRequest осигурява много контрол върху обекта заявка / отговор. Трябва обаче да знаете, че HttpClient никога не е проектиран да бъде заместител на WebClient. Трябва да използвате HttpWebRequest вместо HttpClient, когато имате нужда от допълнителните функции, които HttpWebRequest предоставя. Освен това, за разлика от WebClient, HttpClient липсва поддръжка за отчитане на напредъка и персонализирани URI схеми. 

Въпреки че HttpClient не поддържа FTP, подиграването и тестването на HttpClient е по-лесно. Всички I / O обвързани методи в HttpClient са асинхронни и можете да използвате един и същ екземпляр HttpClient, за да правите едновременни заявки. Следният кодов фрагмент илюстрира как можете да работите с HttpClient.

обществена асинхронна задача GetAuthorsAsync (низ uri)

{

    Автор автор = нула;

    HttpResponseMessage отговор = изчакайте client.GetAsync (uri);

    ако (response.IsSuccessStatusCode)

    {

        автор = изчакайте отговор.Content.ReadAsAsync ();

    }

    автор на връщане;

}

Имайте предвид, че когато има грешка в отговора, HttpClient не извежда грешка. По-скоро задава IsSuccessStatusCodeсвойството на false. Ако искате да хвърлите изключение, ако IsSuccessStatusCodeсвойството е false, можете да направите извикване на EnsureSuccessStatusCodeметода в екземпляра на отговора, както е показано по-долу.

response.EnsureSuccessStatusCode ();

HttpClient е проектиран да бъде създаден веднъж и повторно използван през целия жизнен цикъл на приложението - не трябва да създавате нов екземпляр на HttpClient за всяка заявка, която вашето приложение трябва да обработи. Ако го направите, наличните сокети могат да бъдат изчерпани от интензивния трафик, което да доведе до  SocketExceptionгрешки. Препоръчителната практика е да се създаде един, споделен екземпляр HttpClient.