root09
@root09

Как правильно поставить timeout в HttpWebRequest?

Есть метод:
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
                request.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate;
                request.UserAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/536.36 (KHTML, like Gecko) Chrome/63.0.3239.142 Safari/536.36";
                request.Accept = "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8";
                request.Headers.Add("Accept-Language: ru-RU,ru;q=0.9,en-US;q=0.8,en;q=0.7,zh-CN;q=0.6,zh;q=0.5,sv;q=0.4,zh-TW;q=0.3,es;q=0.2,de;q=0.1,nl;q=0.1");
                request.Timeout = 4000;
                request.ServicePoint.ConnectionLeaseTimeout = 4000;
                request.ServicePoint.MaxIdleTime = 4000;
                request.ReadWriteTimeout = 4000;
                request.ContinueTimeout = 4000;

                if (proxy.Length > 0)
                {
                    string[] prox = proxy.Split(':');
                    request.Proxy = new WebProxy(prox[0], Convert.ToInt32(prox[1]));
                }

                using (HttpWebResponse response = (HttpWebResponse)request.GetResponse())
                using (Stream stream = response.GetResponseStream())
                using (StreamReader reader = new StreamReader(stream))
                {
                    return reader.ReadToEnd();
                }

Который получает содержимое страницы через прокси, всё работает хорошо, за исключением того, что попадаются такие прокси, которые отвечают слишком долго, и вот эти таймауты не помогают, метод может выполняться намного дольше этих 4 секунд, нужно завершать запросы которые идут дольше 4 секунд, как это можно сделать?
  • Вопрос задан
  • 1006 просмотров
Пригласить эксперта
Ответы на вопрос 1
profesor08
@profesor08
Увеличь таймауты до максимально дозволительного значения, если запрос не проходит за отведенное время, то меняешь на другой прокси и повторяешь запрос. Обычно так и делается.

Еще можешь поставить Int32.MaxValue и проблема решится. Но зачем так делать, если прокси сдох то ты не дождешься завершения.

Либо можешь оставить Int32.MaxValue и написать свой счетчик, который по какому-то хитрому алгоритму будет решать, обрывать связь или подождать еще чуть чуть.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы