using (WebResponse response = request.GetResponse())
{
    response.GetResponseStream().CopyTo(destination);
}

Тримайте кожну стару відповідь HttpWebRequest в області, яка завершує її споживання й звільняє її. Тут destination — записуваний вихідний потік застосунку; блок using звільняє WebResponse навіть якщо копіювання не вдалося, не перебираючи володіння цим виходом.

Успіх одного проксі-запиту й очікування наступних може вказувати на незавершені відповіді, що займають ресурси з'єднання. Саме отримання WebResponse не завершує його тіло. Час очікування запиту обмежує чекання, а не час життя кожної вже отриманої відповіді.

Застосовуйте те саме володіння до помилок. WebException може нести відповідь, яку перевіряє ваш код; закривайте її після перевірки. Збій транспорту може взагалі не мати відповіді.

Звільнення повертає ресурси відповіді, але не гарантує повторно використовуваних з'єднань у кожному випадку. Протокол, сервер і споживання тіла все ще важливі.

Це стосується обслуговування старого стеку WebRequest. У новішому коді дотримуйтеся володіння відповіддю/потоком реального клієнта; для HttpClient тримайте відповіді в області їх звільнення, і відрізняйте цей збій очищення від автентифікації проксі чи вибору маршруту.

Схожі статті