Décider entre HttpClient et WebClient

Notre application web s’exécute dans .Net Framework 4.0. L’interface utilisateur appelle des méthodes de contrôleur via des appels ajax.

Nous devons consumr le service REST de notre fournisseur. J’évalue la meilleure façon d’appeler le service REST dans .Net 4.0. Le service REST nécessite un schéma d’authentification de base et peut renvoyer des données à la fois XML et JSON. Il n’y a pas d’exigence pour le téléchargement / le téléchargement de données volumineuses et je ne vois rien à l’avenir. J’ai jeté un coup d’oeil à quelques projets de code source ouvert pour la consommation de REST et je n’ai trouvé aucune valeur pour justifier une dépendance supplémentaire dans le projet. Commencé à évaluer WebClient et HttpClient . J’ai téléchargé HttpClient pour .Net 4.0 depuis NuGet.

J’ai cherché des différences entre WebClient et HttpClient et ce site a mentionné qu’un seul HttpClient peut gérer des appels simultanés et qu’il peut réutiliser le DNS, la configuration des cookies et l’authentification résolus. Je n’ai pas encore vu de valeurs pratiques que nous pourrions gagner en raison des différences.

J’ai effectué un test de performance rapide pour trouver comment WebClient (appels de synchronisation), HttpClient (sync et asynchrone). et voici les résultats:

Utiliser la même instance HttpClient pour toutes les requêtes (min – max)

Synchronisation WebClient: 8 ms – 167 ms
Syntaxe HttpClient: 3 ms – 7228 ms
Async HttpClient: 985 – 10405 ms

Utiliser un nouveau HttpClient pour chaque requête (min – max)

Synchronisation WebClient: 4 ms – 297 ms
Syntaxe HttpClient: 3 ms – 7953 ms
HttpClient async: 1027 – 10834 ms

Code

 public class AHNData { public int i; public ssortingng str; } public class Program { public static HttpClient httpClient = new HttpClient(); private static readonly ssortingng _url = "http://localhost:9000/api/values/"; public static void Main(ssortingng[] args) { #region "Trace" Trace.Listeners.Clear(); TextWriterTraceListener twtl = new TextWriterTraceListener( "C:\\Temp\\REST_Test.txt"); twtl.Name = "TextLogger"; twtl.TraceOutputOptions = TraceOptions.ThreadId | TraceOptions.DateTime; ConsoleTraceListener ctl = new ConsoleTraceListener(false); ctl.TraceOutputOptions = TraceOptions.DateTime; Trace.Listeners.Add(twtl); Trace.Listeners.Add(ctl); Trace.AutoFlush = true; #endregion int batchSize = 1000; ParallelOptions parallelOptions = new ParallelOptions(); parallelOptions.MaxDegreeOfParallelism = batchSize; ServicePointManager.DefaultConnectionLimit = 1000000; Parallel.For(0, batchSize, parallelOptions, j => { Stopwatch sw1 = Stopwatch.StartNew(); GetDataFromHttpClientAsync<List>(sw1); }); Parallel.For(0, batchSize, parallelOptions, j => { Stopwatch sw1 = Stopwatch.StartNew(); GetDataFromHttpClientSync<List>(sw1); }); Parallel.For(0, batchSize, parallelOptions, j => { using (WebClient client = new WebClient()) { Stopwatch sw = Stopwatch.StartNew(); byte[] arr = client.DownloadData(_url); sw.Stop(); Trace.WriteLine("WebClient Sync " + sw.ElapsedMilliseconds); } }); Console.Read(); } public static T GetDataFromWebClient() { using (var webClient = new WebClient()) { webClient.BaseAddress = _url; return JsonConvert.DeserializeObject( webClient.DownloadSsortingng(_url)); } } public static void GetDataFromHttpClientSync(Stopwatch sw) { HttpClient httpClient = new HttpClient(); var response = httpClient.GetAsync(_url).Result; var obj = JsonConvert.DeserializeObject( response.Content.ReadAsSsortingngAsync().Result); sw.Stop(); Trace.WriteLine("HttpClient Sync " + sw.ElapsedMilliseconds); } public static void GetDataFromHttpClientAsync(Stopwatch sw) { HttpClient httpClient = new HttpClient(); var response = httpClient.GetAsync(_url).ContinueWith( (a) => { JsonConvert.DeserializeObject( a.Result.Content.ReadAsSsortingngAsync().Result); sw.Stop(); Trace.WriteLine("HttpClient Async " + sw.ElapsedMilliseconds); }, TaskContinuationOptions.None); } } } 

Mes questions

  1. Le REST appelle le retour en 3-4, ce qui est acceptable. Les appels au service REST sont lancés dans les méthodes de contrôleur qui sont appelées à partir d’appels ajax. Pour commencer, les appels s’exécutent dans un thread différent et ne bloquent pas l’interface utilisateur. Alors, puis-je restr avec les appels de synchronisation?
  2. Le code ci-dessus a été exécuté dans ma boîte aux lettres locale. Dans la configuration de prod, la recherche de DNS et de proxy sera impliquée. Y a-t-il un avantage à utiliser HttpClient sur WebClient ?
  3. La concurrence HttpClient est- HttpClient meilleure que WebClient ? D’après les résultats du test, les appels de synchronisation WebClient sont plus performants.
  4. HttpClient sera- HttpClient il un meilleur choix de conception si nous passons à .Net 4.5? La performance est le facteur de conception clé.

Je vis dans les mondes F # et Web API.

Il y a beaucoup de bonnes choses à faire avec l’API Web, en particulier sous la forme de gestionnaires de messages pour la sécurité, etc.

Je sais que le mien n’est qu’une opinion, mais je recommanderais seulement l’utilisation de HttpClient pour tout travail futur . Peut-être y a-t-il un moyen d’exploiter certains des autres System.Net.Http qui sortent de System.Net.Http sans utiliser cet assemblage directement, mais je ne peux pas imaginer comment cela fonctionnerait en ce moment.

En parlant de comparer ces deux

  • HttpClient est plus proche de HTTP que WebClient.
  • HttpClient n’était pas destiné à remplacer complètement Web Client, car il y a des choses comme la progression du rapport, le schéma d’URI personnalisé et les appels FTP fournis par WebClient – mais HttpClient ne le fait pas.

entrer la description de l'image ici

Si vous utilisez .NET 4.5, veuillez utiliser les avantages asynchrones avec HttpClient fournis par Microsoft aux développeurs. HttpClient est très symésortingque par rapport aux serveurs côté HTTP des protocoles HttpRequest et HttpResponse.

Mise à jour: 5 raisons d’utiliser la nouvelle API HttpClient:

  • En-têtes fortement typés.
  • Caches partagés, cookies et identifiants
  • Accès aux cookies et cookies partagés
  • Contrôle de la mise en cache et du cache partagé.
  • Injectez votre module de code dans le pipeline ASP.NET. Code plus propre et modulaire.

Référence

C # 5.0 Joseph Albahari

(Channel9 – Video Build 2013)

Cinq bonnes raisons d’utiliser la nouvelle API HttpClient pour se connecter aux services Web

WebClient vs HttpClient vs HttpWebRequest

HttpClient est la plus récente des API et présente les avantages de

  • a un bon modèle de programmation asynchrone
  • Travaillé par Henrik F Nielson, qui est l’un des inventeurs de HTTP, et il a conçu l’API pour qu’il soit facile de suivre le standard HTTP, par exemple pour générer des en-têtes conformes aux normes.
  • est dans le .Net Framework 4.5, il a donc un certain niveau de support pour l’avenir prévisible
  • a également la version xcopyable / portable-framework de la bibliothèque si vous voulez l’utiliser sur d’autres plates-formes – .Net 4.0, Windows Phone etc.

Si vous écrivez un service Web qui effectue des appels REST vers d’autres services Web, vous devriez vouloir utiliser un modèle de programmation asynchrone pour tous vos appels REST, afin de ne pas toucher à la chaîne de threads. Vous voulez probablement aussi utiliser le plus récent compilateur C # qui a un support asynchrone / en attente.

Note: Il n’est pas plus performant AFAIK. C’est probablement un peu similaire si vous créez un test équitable.

Tout d’abord, je ne suis pas une autorité sur WebClient vs HttpClient, en particulier. Deuxièmement, d’après vos commentaires ci-dessus, il semble suggérer que WebClient est Sync ONLY alors que HttpClient est les deux.

J’ai effectué un test de performance rapide pour déterminer comment fonctionnent WebClient (appels de synchronisation), HttpClient (Sync et Async). et voici les résultats.

Je vois cela comme une énorme différence quand on pense à l’avenir, c’est-à-dire des processus de longue durée, une interface graphique réactive, etc. (ajout à l’avantage de Framework 4.5 – qui est beaucoup plus rapide dans IIS)