Je construis une bibliothèque de classes pour interagir avec une API. Je dois appeler l'API et traiter la réponse XML. Je peux voir les avantages de l'utilisation HttpClient
de la connectivité asynchrone, mais ce que je fais est purement synchrone, donc je ne vois aucun avantage significatif par rapport à l'utilisation HttpWebRequest
.
Si quelqu'un peut faire la lumière, je l'apprécierais beaucoup. Je ne suis pas du genre à utiliser les nouvelles technologies pour le plaisir.
c#
asp.net
dotnet-httpclient
Ketchup
la source
la source
Réponses:
Vous pouvez très bien utiliser
HttpClient
pour les requêtes synchrones:En ce qui concerne la raison pour laquelle vous devriez utiliser
HttpClient
overWebRequest
, eh bien,HttpClient
le nouvel enfant est sur le point et pourrait contenir des améliorations par rapport à l'ancien client.la source
string responseString = Task.Run(() => responseContent.ReadAsStringAsync()).Result;
si vous devez rendre ce synchrone.Task.Run
appelle la tâche à partir d'un ThreadPool, mais vous l'appelez.Result
en supprimant tous les avantages et en bloquant le thread dans lequel vous l'avez appelé.Result
(qui se trouve généralement être le thread principal de l'interface utilisateur)..Result
tel appel peut épuiser le pool de threads et provoquer un blocage.new TaskFactory(TaskScheduler.FromCurrentSynchronizationContext()
Je réitérerais la réponse de Donny V. et celle de Josh
(et voter pour si j'avais la réputation.)
Je ne me souviens pas de la dernière fois, si jamais, j'étais reconnaissant du fait que HttpWebRequest ait lancé des exceptions pour les codes d'état> = 400. Pour contourner ces problèmes, vous devez attraper les exceptions immédiatement et les mapper à certains mécanismes de réponse sans exception dans votre code ... ennuyeux, fastidieux et sujet aux erreurs en soi. Qu'il s'agisse de communiquer avec une base de données ou d'implémenter un proxy Web sur mesure, il est «presque» toujours souhaitable que le pilote Http dise simplement à votre code d'application ce qui a été renvoyé et vous laisse le soin de décider comment vous comporter.
Par conséquent, HttpClient est préférable.
la source
HttpClient
lui - même soit un wrapperHttpWebRequest
(qui en effet, intercepte cesWebException
objets en interne et effectue la conversion en unHttpResponseMessage
pour vous). J'aurais pensé qu'il serait plus facile de créer un nouveau client entièrement à partir de zéro.Si vous créez une bibliothèque de classes, les utilisateurs de votre bibliothèque souhaiteraient peut-être utiliser votre bibliothèque de manière asynchrone. Je pense que c'est la principale raison ici.
Vous ne savez pas non plus comment votre bibliothèque sera utilisée. Peut-être que les utilisateurs traiteront beaucoup, beaucoup de demandes, et le faire de manière asynchrone l'aidera à fonctionner plus rapidement et plus efficacement.
Si vous pouvez le faire simplement, essayez de ne pas mettre le fardeau sur les utilisateurs de votre bibliothèque qui tentent de rendre le flux asynchrone lorsque vous pouvez vous en occuper pour eux.
La seule raison pour laquelle je n'utiliserais pas la version asynchrone est si j'essayais de prendre en charge une ancienne version de .NET qui n'a pas déjà intégré la prise en charge asynchrone.
la source
Dans mon cas, la réponse acceptée n'a pas fonctionné. J'appelais l'API à partir d'une application MVC qui n'avait aucune action asynchrone.
Voici comment j'ai réussi à le faire fonctionner:
Ensuite, je l'ai appelé comme ceci:
la source
ensuite
si vous utilisez cette classe, passez votre méthode async comme paramètre, vous pouvez appeler les méthodes async à partir des méthodes de synchronisation de manière sûre.
c'est expliqué ici: https://cpratt.co/async-tips-tricks/
la source
Toutes les réponses semblent se concentrer sur l'utilisation
HttpClient
synchrone au lieu de donner une réponse réelle à la question.HttpClient
est plus qu'un simple gestionnaire de requêtes / réponses, il peut donc gérer certaines particularités de différents réseaux. À savoir dans mon cas, travailler avec un proxy NTLM qui nécessite une négociation, l'envoi de plusieurs demandes / réponses avec des jetons et des informations d'identification entre le client et le serveur proxy pour s'authentifier.HttpClient
(usingHttpClientHandler
) semble avoir un mécanisme intégré qui gère le retour des ressources au-delà du proxy avec un seul appel de méthode.la source