Quando utilizzare WebClient vs. HttpClient vs. HttpWebRequest

Sono disponibili tre diverse scelte per l'utilizzo delle API REST quando si lavora in .NET Framework: WebClient, HttpClient e HttpWebRequest. In questo post esamineremo questi tre modi in cui possiamo accedere alle API REST dall'interno dell'ambiente gestito, ovvero senza ricorrere a librerie di terze parti. Nelle sezioni che seguono illustrerò questi approcci con esempi di codice pertinenti per aiutarti a ottenere una migliore comprensione dei concetti.

In poche parole, WebRequest, nella sua implementazione specifica per HTTP, HttpWebRequest, rappresenta il modo originale per utilizzare le richieste HTTP in .NET Framework. WebClient fornisce un wrapper semplice ma limitato attorno a HttpWebRequest. E HttpClient è il modo nuovo e migliorato di eseguire richieste e post HTTP, essendo arrivato con .NET Framework 4.5.

Cominciamo la nostra discussione con la classe astratta WebRequest.

System.Net.WebRequest

La classe System.Net.WebRequest è una classe astratta. Quindi sarà necessario creare un HttpWebRequest o FileWebRequest per consumare le richieste HTTP utilizzando questa classe. Il frammento di codice seguente mostra come lavorare con WebRequest.

WebRequest webRequest = WebRequest.Create (uri);

webRequest.Credentials = CredentialCache.DefaultCredentials;

webRequest.Method;

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

System.Net.HttpWebRequest

WebRequest è stata la prima classe fornita in .NET Framework a utilizzare le richieste HTTP. Offre molta flessibilità nella gestione di ogni aspetto degli oggetti richiesta e risposta, senza bloccare il thread dell'interfaccia utente. È possibile utilizzare questa classe per accedere e lavorare con intestazioni, cookie, protocolli e timeout quando si lavora con HTTP. Il frammento di codice seguente illustra come utilizzare HttpWebRequest.

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

Risposta WebResponse = http.GetResponse ();

MemoryStream memoryStream = response.GetResponseStream ();

StreamReader streamReader = nuovo StreamReader (memoryStream);

dati stringa = streamReader.ReadToEnd ();

Puoi trovare la documentazione di Microsoft su HttpWebRequest qui. 

System.Net.WebClient

La classe System.Net.WebClient in .NET fornisce un'astrazione di alto livello oltre a HttpWebRequest. WebClient è solo un wrapper per HttpWebRequest, quindi utilizza HttpWebRequest internamente. Quindi WebClient è un po 'lento rispetto a HttpWebRequest, ma richiede di scrivere molto meno codice. È possibile utilizzare WebClient per semplici modi di connettersi e lavorare con i servizi HTTP. In genere è una scelta migliore di HttpWebRequest a meno che non sia necessario sfruttare le funzionalità aggiuntive fornite da HttpWebRequest. Il frammento di codice seguente mostra come lavorare con WebClient.

dati stringa = null;

utilizzando (var webClient = new WebClient ())

{

    data = webClient.DownloadString (url);

}

System.Net.Http.HttpClient

HttpClient è stato introdotto in .NET Framework 4.5. Per gli sviluppatori che utilizzano .NET 4.5 o versioni successive, è il modo migliore per utilizzare le richieste HTTP a meno che non si disponga di un motivo specifico per non utilizzarlo. In sostanza, HttpClient combina la flessibilità di HttpWebRequest e la semplicità di WebClient, offrendoti il ​​meglio di entrambi i mondi.

La classe HttpWebRequest fornisce molto controllo sull'oggetto richiesta / risposta. Tuttavia, è necessario tenere presente che HttpClient non è mai stato progettato per sostituire WebClient. È necessario utilizzare HttpWebRequest anziché HttpClient ogni volta che sono necessarie le funzionalità aggiuntive fornite da HttpWebRequest. Inoltre, a differenza di WebClient, HttpClient non dispone del supporto per la segnalazione dello stato di avanzamento e per gli schemi URI personalizzati. 

Sebbene HttpClient non supporti FTP, deridere e testare HttpClient è più semplice. Tutti i metodi associati a I / O in HttpClient sono asincroni ed è possibile utilizzare la stessa istanza di HttpClient anche per effettuare richieste simultanee. Il frammento di codice seguente illustra come lavorare con HttpClient.

public async Task GetAuthorsAsync (stringa uri)

{

    Autore autore = null;

    HttpResponseMessage response = attende client.GetAsync (uri);

    if (response.IsSuccessStatusCode)

    {

        autore = attende la risposta.Content.ReadAsAsync ();

    }

    autore di ritorno;

}

Si noti che quando si verifica un errore nella risposta, HttpClient non genera un errore. Piuttosto, imposta la IsSuccessStatusCodeproprietà su false. Se si desidera generare un'eccezione se la IsSuccessStatusCodeproprietà è false, è possibile effettuare una chiamata al EnsureSuccessStatusCodemetodo sull'istanza di risposta come mostrato di seguito.

response.EnsureSuccessStatusCode ();

HttpClient è stato progettato per essere istanziato una sola volta e riutilizzato per tutto il ciclo di vita dell'applicazione: non creare una nuova istanza HttpClient per ogni richiesta che l'applicazione deve elaborare. In caso contrario, i socket disponibili potrebbero esaurirsi a causa del traffico intenso, provocando  SocketExceptionerrori. La pratica consigliata è creare un'unica istanza HttpClient condivisa.