2012-12-30 1 views
6

J'utilise System.Net.Http.HttpClient pour publier une séquence de demandes d'une application console vers une API REST et désérialiser les réponses JSON dans des objets fortement typés. Ma mise en œuvre est comme ceci:.NET HttpClient se bloque après plusieurs requêtes (sauf si Fiddler est actif)

using (var client = new HttpClient()) 
{ 
    var content = new StringContent(data, Encoding.UTF8, "text/html"); 
    var response = client.PostAsync(url, content).Result; 

    response.EnsureSuccessStatusCode(); 

    return response.Content.ReadAsAsync<MyClass>().Result; 
} 

Cependant, je suis confronté à un problème très similaire à celui décrit dans this question, où tout fonctionne bien lorsque les demandes sont acheminées via Fiddler, mais il se bloque après la 4ème ou demande 5 lorsque Fiddler est désactivé. Si la cause du problème est la même, je suppose que je dois faire quelque chose de plus avec HttpClient pour obtenir la libération complète de ses ressources après chaque demande, mais je suis incapable de trouver des exemples de code qui montrent comment faire cela . En espérant que quelqu'un puisse me diriger dans la bonne direction.

Un grand merci,

Tim

Répondre

8

Vous n'êtes pas débarrassez de l'objet HttpResponseMessage. Cela peut laisser des flux ouverts avec le serveur, et après qu'un certain quota de flux avec un serveur individuel est rempli, aucune autre requête ne sera envoyée.

using (var client = new HttpClient()) 
{ 
    var content = new StringContent(data, Encoding.UTF8, "text/html"); 
    using(var response = client.PostAsync(url, content).Result) 
    {  
     response.EnsureSuccessStatusCode(); 
     return response.Content.ReadAsAsync<MyClass>().Result; 
    } 
} 
+0

Merci Andrew - c'était une bouée de sauvetage. En fait, j'ai déjà vu ce problème lors de l'utilisation de HttpWebRequest et la solution était la même, mais il n'était pas immédiatement évident de savoir comment le faire avec le modèle de code HttpClient. Merci encore. –

+0

Il se passe autre chose ici. Le seul flux ici est NetworkStream qui est transmis dans l'objet StreamContent affecté à la propriété Content du message de réponse. Lorsque HttpClient est utilisé comme ceci, le corps de la réponse est automatiquement mis en mémoire tampon et tout flux non-cherchable sera automatiquement éliminé lorsqu'il sera mis en mémoire tampon. Il n'est pas nécessaire de disposer un HttpResponseMessage qui est récupéré par HttpClient en utilisant HttpCompletionOption.ResponseContentRead. –

Questions connexes