Освобождайте ответы HttpWebRequest между прокси-запросами
Дайте старым ответам HttpWebRequest ясное время жизни, чтобы повторные прокси-запросы не удерживали ресурсы соединения бесконечно.
using (WebResponse response = request.GetResponse())
{
response.GetResponseStream().CopyTo(destination);
}
Держите каждый старый ответ HttpWebRequest в области, которая завершает его потребление и освобождает его. Здесь destination — записываемый выходной поток приложения; блок using освобождает WebResponse даже при сбое копирования, не принимая владение этим потоком.
Успех одного прокси-запроса и ожидание последующих может указывать на незавершённые ответы, занимающие ресурсы соединения. Получение WebResponse само по себе не завершает его тело. Тайм-аут запроса ограничивает ожидание, а не время жизни каждого уже полученного ответа.
Применяйте то же владение к ошибкам. WebException может нести ответ, который проверяет ваш код; закрывайте его после проверки. При сбое транспорта ответа может не быть вовсе.
Освобождение возвращает ресурсы ответа, но не гарантирует повторно используемые соединения в каждом случае. Протокол, сервер и потребление тела по-прежнему важны.
Это касается обслуживания старого стека WebRequest. В более новом коде следуйте владению ответом/потоком реального клиента; для HttpClient держите ответы в области их освобождения, и отличайте этот сбой очистки от аутентификации прокси или выбора маршрута.