Zwalniaj odpowiedzi HttpWebRequest między żądaniami proxy
Nadaj starym odpowiedziom HttpWebRequest wyraźny okres życia, aby powtarzane żądania proxy nie zajmowały trwale zasobów połączeń.
using (WebResponse response = request.GetResponse())
{
response.GetResponseStream().CopyTo(destination);
}
Trzymaj każdą starą odpowiedź HttpWebRequest w zakresie, który dopełnia jej zużycie i ją zwalnia. Tutaj destination to zapisywalny strumień wyjściowy aplikacji; blok using zwalnia WebResponse nawet jeśli kopiowanie się nie powiedzie, bez przejmowania własności tego wyjścia.
To, że jedno żądanie proxy się powiedzie, a kolejne czekają, może wskazywać na niedokończone odpowiedzi zajmujące zasoby połączeń. Samo otrzymanie WebResponse nie kończy jego treści. Limit czasu żądania ogranicza oczekiwanie, a nie czas życia każdej już uzyskanej odpowiedzi.
Zastosuj tę samą własność do błędów. WebException może nieść odpowiedź, którą kod sprawdza; zamknij ją po sprawdzeniu. Awaria transportu może w ogóle nie mieć odpowiedzi.
Zwolnienie oddaje zasoby odpowiedzi, ale nie obiecuje w każdym przypadku połączeń wielokrotnego użytku. Protokół, serwer i zużycie treści nadal mają znaczenie.
Dotyczy to utrzymania starego stosu WebRequest. W nowszym kodzie podążaj za własnością odpowiedzi/strumienia rzeczywistego klienta; w przypadku HttpClient trzymaj odpowiedzi w ich zakresie zwalniania i odróżniaj tę awarię czyszczenia od uwierzytelniania proxy lub wyboru trasy.