.NET HttpClient зависает после нескольких запросов (если не активен Fiddler)

Я использую System.Net.Http.HttpClient для отправки последовательности запросов из консольного приложения в REST API и для десериализации ответов JSON в строго типизированные объекты. Моя реализация такова:

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

Однако у меня возникла проблема, очень похожая на описанную в этом вопросе, при которой все работает нормально, когда запросы направляются через Fiddler, но он зависает после 4-го или 5-го запроса, когда Fiddler отключен.

Если причина проблемы та же, я предполагаю, что мне нужно сделать что-то еще с HttpClient, чтобы заставить его полностью освобождать свои ресурсы после каждого запроса, но я не могу найти примеры кода, которые показывают, как это сделать.

Надеясь, что кто-то может указать мне в правильном направлении.

Большое спасибо,

Тим


person Tim Coulter    schedule 30.12.2012    source источник


Ответы (1)


Вы не избавляетесь от объекта HttpResponseMessage. Это может оставить открытыми потоки с сервером, и после того, как некоторая квота потоков с отдельным сервером будет заполнена, запросы больше не будут отправляться.

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;
    }
}
person Andrew Arnott    schedule 31.12.2012
comment
Спасибо, Андрей, выручил. На самом деле, я видел эту проблему раньше при использовании HttpWebRequest, и решение было таким же, но не сразу было очевидно, как это сделать с помощью шаблона кода HttpClient. Спасибо еще раз. - person Tim Coulter; 01.01.2013
comment
Здесь происходит что-то еще. Единственным потоком здесь является NetworkStream, который передается в объект StreamContent, назначенный свойству Content ответного сообщения. Когда HttpClient используется таким образом, тело ответа автоматически буферизуется, и любой недоступный для поиска поток будет автоматически удаляться при буферизации. Нет необходимости удалять HttpResponseMessage, полученный HttpClient с помощью HttpCompletionOption.ResponseContentRead. - person Darrel Miller; 05.11.2013