web-dev-qa-db-fra.com

HttpClient vs HttpWebRequest

J'ai un gros fichier que je dois envoyer à un client web api ... Les données sont en plusieurs parties. Le problème est que si le fichier est envoyé via une requête Web http, il est rapidement téléchargé sur la webapi. Pour cette demande, le contenu du fichier est écrit directement sur le flux de demande.

Lorsque, comme si le même fichier était envoyé via Httpclient (.net 4.5), le téléchargement est lent par rapport à la requête Web http. J'utilise multipartformdatacontent dans Httpclient post async.

Donc, pour les fichiers volumineux, devons-nous utiliser uniquement la demande Web? ou existe-t-il des paramètres sur Httpclient qui accélèrent le téléchargement?

41
user2325247

HttpClient ressemble plus à un navigateur sans tête. C'est un outil puissant et idéal si vous allez créer de nombreuses requêtes http. Par exemple, vous pouvez définir des en-têtes et autres éléments par défaut. Voici les 5 principales différences avec un HttpWebRequest qui est tiré de ici

  1. Une instance HttpClient est l'endroit pour configurer les extensions, définir les en-têtes par défaut, annuler les demandes en attente et plus encore.
  2. Vous pouvez émettre autant de demandes que vous le souhaitez via une seule instance HttpClient.
  3. Les HttpClients ne sont pas liés à un serveur HTTP ou à un hôte particulier; vous pouvez soumettre n'importe quelle demande HTTP en utilisant la même instance HttpClient.
  4. Vous pouvez dériver de HttpClient pour créer des clients spécialisés pour des sites ou des modèles particuliers
  5. HttpClient utilise le nouveau modèle orienté tâches pour gérer les demandes asynchrones, ce qui facilite considérablement la gestion et la coordination de plusieurs demandes en attente.
43
Krimson

J'utilisais FileStreamContent avec httpclient ... Mais quand j'ai utilisé ByteArrayContent, cela a bien fonctionné.

Je ne sais pas comment et pourquoi cela a fait la différence, mais l'envoi d'octets sur le flux est une meilleure façon que d'envoyer le flux

3
user2325247

Peut-être que vous instanciez HttpClient dans un bloc using, ce qui pourrait expliquer les problèmes de performances. Par exemple.

  using (var httpClient = new HttpClient() )
  {
      var result = await httpClient.GetAsync("http://example.com");
      Console.WriteLine(result.StatusCode);
  }

Ici, l'instance de HttpClient est supprimée immédiatement après la demande alors qu'elle devrait sans doute être un objet à longue durée de vie (par exemple, la durée de vie de l'application).

[modifier - contexte ajouté]

L'élimination de l'instance ferme également la connexion mais laisse le socket en attente pendant une durée définie. Pour chaque exécution de ce code, le système d'exploitation tentera de créer une nouvelle connexion socket, et comme il y a une limite à la vitesse à laquelle cela peut être effectué, des problèmes de performances/fiabilité peuvent survenir.

La réutilisation de la même instance HttpClient signifie une meilleure réutilisation des sockets ouverts et une utilisation plus efficace des ressources système.

Plus d'infos ici .

3
mounds