Quand utiliser WebClient vs HttpClient vs HttpWebRequest

Vous avez trois choix différents pour consommer les API REST lorsque vous travaillez dans le .NET Framework: WebClient, HttpClient et HttpWebRequest. Dans cet article, nous examinerons ces trois façons d'accéder aux API REST à partir de l'environnement géré, c'est-à-dire sans recourir à des bibliothèques tierces. Dans les sections qui suivent, je vais illustrer ces approches avec des exemples de code pertinents pour vous aider à mieux comprendre les concepts.

En un mot, WebRequest - dans son implémentation spécifique à HTTP, HttpWebRequest - représente la manière originale de consommer les requêtes HTTP dans .NET Framework. WebClient fournit un wrapper simple mais limité autour de HttpWebRequest. Et HttpClient est le moyen nouveau et amélioré de faire des requêtes et des publications HTTP, arrivé avec .NET Framework 4.5.

Commençons notre discussion avec la classe abstraite WebRequest.

System.Net.WebRequest

La classe System.Net.WebRequest est une classe abstraite. Ainsi, vous devrez créer un HttpWebRequest ou FileWebRequest pour consommer les requêtes HTTP en utilisant cette classe. L'extrait de code suivant montre comment vous pouvez travailler avec WebRequest.

WebRequest webRequest = WebRequest.Create (uri);

webRequest.Credentials = CredentialCache.DefaultCredentials;

webRequest.Method;

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

System.Net.HttpWebRequest

WebRequest était la première classe fournie dans le .NET Framework à consommer des requêtes HTTP. Il vous donne une grande flexibilité dans la gestion de chaque aspect des objets de requête et de réponse, sans bloquer le thread de l'interface utilisateur. Vous pouvez utiliser cette classe pour accéder et travailler avec des en-têtes, des cookies, des protocoles et des délais d'expiration lorsque vous travaillez avec HTTP. L'extrait de code suivant illustre comment HttpWebRequest peut être utilisé.

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

Réponse WebResponse = http.GetResponse ();

MemoryStream memoryStream = response.GetResponseStream ();

StreamReader streamReader = nouveau StreamReader (memoryStream);

string data = streamReader.ReadToEnd ();

Vous pouvez trouver la documentation de Microsoft sur HttpWebRequest ici. 

System.Net.WebClient

La classe System.Net.WebClient dans .NET fournit une abstraction de haut niveau par-dessus HttpWebRequest. WebClient est juste un wrapper autour de HttpWebRequest, utilise donc HttpWebRequest en interne. Ainsi WebClient est un peu lent par rapport à HttpWebRequest, mais vous oblige à écrire beaucoup moins de code. Vous pouvez utiliser WebClient pour des moyens simples de vous connecter et de travailler avec des services HTTP. C'est généralement un meilleur choix que HttpWebRequest, sauf si vous devez tirer parti des fonctionnalités supplémentaires fournies par HttpWebRequest. L'extrait de code suivant montre comment vous pouvez travailler avec WebClient.

string data = null;

en utilisant (var webClient = new WebClient ())

{

    data = webClient.DownloadString (url);

}

System.Net.Http.HttpClient

HttpClient a été introduit dans .NET Framework 4.5. Pour les développeurs utilisant .NET 4.5 ou version ultérieure, c'est le moyen préféré de consommer les requêtes HTTP, sauf si vous avez une raison spécifique de ne pas l'utiliser. En substance, HttpClient combine la flexibilité de HttpWebRequest et la simplicité de WebClient, vous offrant le meilleur des deux mondes.

La classe HttpWebRequest fournit beaucoup de contrôle sur l'objet demande / réponse. Cependant, vous devez savoir que HttpClient n'a jamais été conçu pour remplacer WebClient. Vous devez utiliser HttpWebRequest au lieu de HttpClient chaque fois que vous avez besoin des fonctionnalités supplémentaires fournies par HttpWebRequest. De plus, contrairement à WebClient, HttpClient ne prend pas en charge les rapports de progression et les schémas d'URI personnalisés. 

Bien que HttpClient ne prenne pas en charge FTP, se moquer et tester HttpClient est plus facile. Toutes les méthodes liées aux E / S dans HttpClient sont asynchrones et vous pouvez également utiliser la même instance HttpClient pour effectuer des requêtes simultanées. L'extrait de code suivant illustre comment vous pouvez travailler avec HttpClient.

Tâche publique async GetAuthorsAsync (string uri)

{

    Auteur auteur = null;

    Réponse HttpResponseMessage = attendre client.GetAsync (uri);

    if (response.IsSuccessStatusCode)

    {

        author = attendre la réponse.Content.ReadAsAsync ();

    }

    retour auteur;

}

Notez que lorsqu'il y a une erreur dans la réponse, HttpClient ne renvoie pas d'erreur. Au contraire, il définit la IsSuccessStatusCodepropriété sur false. Si vous souhaitez lever une exception si la IsSuccessStatusCodepropriété est false, vous pouvez effectuer un appel à la EnsureSuccessStatusCodeméthode sur l'instance de réponse comme indiqué ci-dessous.

response.EnsureSuccessStatusCode ();

HttpClient a été conçu pour être instancié une seule fois et réutilisé tout au long du cycle de vie de l'application. Vous ne devez pas créer une nouvelle instance HttpClient pour chaque demande que votre application doit traiter. Si vous le faites, les sockets disponibles pourraient être épuisés par un trafic intense, entraînant des  SocketExceptionerreurs. La pratique recommandée consiste à créer une seule instance HttpClient partagée.