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?
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
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
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 .