2012-12-30 7 views
6

Używam System.Net.Http.HttpClient do wysyłania sekwencji żądań z aplikacji konsoli do REST API i do deserializacji odpowiedzi JSON na obiekty o silnym typie. Moja implementacja jest tak:.NET HttpClient zawiesza się po kilku żądaniach (chyba, że ​​Skrzypek jest aktywny)

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

Jestem jednak występuje problem bardzo podobny do opisanego w this question, przy czym wszystko działa dobrze, gdy wnioski są kierowane poprzez Skrzypek, ale zawiesza się po 4 lub 5 żądanie podczas Fiddler jest wyłączony.

Jeśli przyczyna problemu jest taka sama, zakładam, że muszę zrobić coś więcej dzięki HttpClient, aby uzyskać pełne zwolnienie zasobów po każdym żądaniu, ale nie mogę znaleźć żadnych próbek kodu, które pokazują, jak to zrobić .

Mam nadzieję, że ktoś wskaże mi właściwy kierunek.

Dziękujemy,

Tim

Odpowiedz

8

Nie pozbywasz obiektu HttpResponseMessage. Może to pozostawić otwarte strumienie na serwerze, a po wypełnieniu niektórych limitów strumieni z pojedynczym serwerem nie będzie już wysyłanych żadnych żądań.

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

Dziękuję Andrzej - to był ratownik. W rzeczywistości widziałem ten problem przed użyciem HttpWebRequest, a rozwiązanie było takie samo, ale nie było od razu oczywiste, jak to zrobić z wzorcem kodu HttpClient. Dzięki jeszcze raz. –

+0

Coś tu się dzieje. Jedynym strumieniem jest tutaj strumień NetworkStream, który jest przekazywany do obiektu StreamContent, który jest przypisany do właściwości Content komunikatu odpowiedzi. Kiedy HttpClient jest używany w ten sposób, treść odpowiedzi jest automatycznie buforowana, a każdy nieczytelny strumień zostanie automatycznie usunięty, gdy zostanie zbuforowany. Nie ma potrzeby umieszczania wiadomości HttpResponseMessage, która jest pobierana przez HttpClient przy użyciu HttpCompletionOption.ResponseContentRead. –

Powiązane problemy