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