2012-12-30 8 views
6

Ich verwende System.Net.Http.HttpClient, um eine Sequenz von Anforderungen von einer Konsolenanwendung an eine REST-API zu senden und die JSON-Antworten in stark typisierte Objekte zu deserialisieren. Meine Implementierung ist wie folgt:.NET HttpClient hängt nach mehreren Anforderungen (außer Fiddler ist aktiv)

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; 
} 

Ich bin jedoch ein Problem sehr ähnlich einem in this question beschriebene Problem auftritt, wobei alles funktioniert gut, wenn die Anfragen über Fiddler geleitet werden, aber es hängt nach dem 4. oder 5. Anfrage bei Fiddler ist deaktiviert.

Wenn die Ursache des Problems die gleiche ist, nehme ich an, ich muss etwas mehr mit HttpClient tun, damit es seine Ressourcen nach jeder Anfrage freigibt, aber ich kann keine Code-Beispiele finden, die zeigen, wie dies zu tun ist .

Ich hoffe, jemand kann mich in die richtige Richtung zeigen.

Vielen Dank,

Tim

Antwort

8

Sie sind nicht von der HttpResponseMessage Objekt zu entsorgen. Dies kann offene Streams mit dem Server belassen, und nachdem einige Streams mit einem einzelnen Server gefüllt sind, werden keine weiteren Anfragen gesendet.

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

Danke Andrew - das war ein Lebensretter. In der Tat habe ich dieses Problem zuvor bei der Verwendung von HttpWebRequest gesehen und die Lösung war die gleiche, aber es war nicht sofort offensichtlich, wie dies mit dem HttpClient-Codemuster zu tun ist. Danke noch einmal. –

+0

Hier läuft noch etwas anderes. Der einzige Stream hier ist der NetworkStream, der an das StreamContent-Objekt übergeben wird, das der Content-Eigenschaft der Antwortnachricht zugewiesen ist. Wenn HttpClient wie folgt verwendet wird, wird der Antworttextkörper automatisch gepuffert und alle nicht suchbaren Datenströme werden automatisch bei der Pufferung entsorgt. Es besteht keine Notwendigkeit, eine HttpResponseMessage zu entsorgen, die von HttpClient mithilfe von HttpCompletionOption.ResponseContentRead abgerufen wird. –