Как отловить ошибку ResourceDownloader.GetResult - HttpGet TimeOut ?

  • Автор темы Автор темы SergSh
  • Дата начала Дата начала

SergSh

Client
Регистрация
10.05.2017
Сообщения
540
Реакции
395
Баллы
63
Запускаю через parallelfor httpget запрос и некоторые потоки отваливаются с ошибкой ResourceDownloader.GetResult превышен таймаут... Таймаут больше 50000 выставлять нет смысла, прокси из проксичекера. Try Catch не дал результата. Каким образом отловить ошибки http, чтоб поток не отваливался? xNet пока не рассматриваю, 2 года ничего не меняется.
 
Данная сообщение означает что превышен timeout загрузки страницы (элемента, не знаю что Вас там) Указано же. т.е. или увеличиваем таймаут или берем другой, рабочий и быстрый прокси.
 
Данная сообщение означает что превышен timeout загрузки страницы (элемента, не знаю что Вас там) Указано же. т.е. или увеличиваем таймаут или берем другой, рабочий и быстрый прокси.
Дело в том, что из за этой ошибки теряются данные, увеличение таймаута не решает проблему, а с htmlagilitypack все останавливается.
 
У меня есть машина, она не едет. Поменял электронику - всё равно не едет. ЧТо не так?
Да хоть что! Вплоть до того, что машина, например, стиральная.
 
  • Оценить
Реакции: Сибиряк
Дело в том, что из за этой ошибки теряются данные, увеличение таймаута не решает проблему, а с htmlagilitypack все останавливается.
Если увеличение таймаута не помогает, значит причина в следующем:
  • Слабый и-нет канал \ Плохой прокси
  • Сайт нестабильно работает
Это не значит, что поток отваливается или это ошибка программы - это нормальное поведение в случае, если не удалось получить ответ от сайта.
Теперь Ваша задача его обработать.

Я обычно делаю экшены запросов необязательными, это позволяет экшену всегда выходить по зелёной ветке.
Далее после каждого экшена запроса я проверяю ответ на пустоту.
Если ответ пустой - меняю прокси (если их используете), итак в цикле примерно 3-5 раз.
Если же замена прокси не помогла, вероятнее всего проблема в сайте и я просто приостанавливал работу шаблона на определённое время.
 
Если кубиком:
g0fl1wJ.png

Если кодом:
C#:
Развернуть Свернуть Копировать
if (!string.IsNullOrWhiteSpace(result)) {
   return "Успешно";
}
 
  • Оценить
Реакции: Hannes и one
у него запросы через parallelfor.
Но зачем здесь выкладывать код, люди догадаются как он выглядит и где проблемное место
 
у него запросы через parallelfor.
Но зачем здесь выкладывать код, люди догадаются как он выглядит и где проблемное место
PHP:
Развернуть Свернуть Копировать
var proxylist = project.Lists["p"];
var result = project.Lists["res"];
var error = project.Lists["error"];
        
        
            string[] additionalHeaders = {
                "Accept-Language: " + project.Profile.AcceptLanguage,
                "Accept: " + project.Profile.HTTPAccept,
                "Accept-Encoding: " + project.Profile.AcceptEncoding,
                };      
        
            ParallelLoopResult loopResult = Parallel.For(0, 100, x => {
        
                var proxy = "";
                lock (CommonCode.pl)
                {  
                    proxy = proxylist[0];
                    proxylist.RemoveAt(0);
                }
                string res = "";
            
                try
                {
            
                    res = ZennoPoster.HttpGet("http://2ip.ru/", "http://" + proxy, "UTF-8", ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.HeaderAndBody, 50000, "", "", true, 3, additionalHeaders);
                }
                catch
                    {
                        lock (CommonCode.res)        
                            {      
                                error.Add(proxy);
                            }
                    }
            
                    if(!string.IsNullOrEmpty(res))
                    {    
                
                        HtmlAgilityPack.HtmlDocument doc = new HtmlAgilityPack.HtmlDocument();        
                        doc.LoadHtml(res);    
                
                        var item = doc.DocumentNode.SelectSingleNode(@"//div[@class='ip']").InnerText;    
                        if (item != null)    
                        {                
                            lock (CommonCode.res)        
                            {      
                                result.Add(items);
                            }
                        }
                }
            });
 
Последнее редактирование:
  • Оценить
Реакции: vrska
У меня есть машина, она не едет. Поменял электронику - всё равно не едет. ЧТо не так?
Да хоть что! Вплоть до того, что машина, например, стиральная.
Из за такого свинства, как ты наклацал, сложно гуглить нужное и еще сложнее потом это все фильтровать по форуму.
 
Из за такого свинства, как ты наклацал, сложно гуглить нужное и еще сложнее потом это все фильтровать по форуму.
Ты прав. Надо было вобще написать "Экстрасенсы в отпуске" и забыть. И пусть ребята и дальше бы с тебя клещами крупицы инфы доставали, тратя своё время
 
что такое res1? Не вижу, где оно объявляется
res1 результат запроса, да, это ошибка которую упустил редактируя код для постинга сюда. Дело не в этом, дело в том, что ты не вкурсе, что ошибка такая существует при таймауте и в коде все работает. Прочекано два десятка тысячь адресов за 15 мин.
 
у него запросы через parallelfor.
Что-то я затупил, не заметил.

Try Catch не дал результата.
В целом, очень похоже на баг т.к. трай-кэтч не обрабатывается даже без параллельных запросов.
Хотя я точно помню, что эта обёртка всегда работала.
 
  • Оценить
Реакции: SergSh
Что-то я затупил, не заметил.


В целом, очень похоже на баг т.к. трай-кэтч не обрабатывается даже без параллельных запросов.
Хотя я точно помню, что эта обёртка всегда работала.
Там без разницы какой таймаут выставлять, при превышении ошибка лезет.
 
Там без разницы какой таймаут выставлять, при превышении ошибка лезет.
Собственно, после запроса работа не останавливается, в случае таймаута - поток продолжает работу, его не выбивает.
Можно сделать такую проверку:
C#:
Развернуть Свернуть Копировать
if (string.IsNullOrWhiteSpace(res)) {
// Берем новый прокси и делаем новый запрос
}
 
ребят, я конечно понимаю что опоздал на 6 лет но решение вот


try catch:
Развернуть Свернуть Копировать
var tmplist = project.Lists["tmplist"].ToList();
var BrokenList = project.Lists["500 Otvet"];


try
{
    System.Threading.Tasks.Parallel.ForEach(tmplist, domain =>
    {
        try
        {
            var response = ZennoPoster.HTTP.Request(
                ZennoLab.InterfacesLibrary.Enums.Http.HttpMethod.HEAD,
                domain,
                respType: ZennoLab.InterfacesLibrary.Enums.Http.ResponceType.HeaderOnly,
                Timeout: 30000,
                throwExceptionOnError: true
            );
            if (response.ToString().Trim() == "")
            {
                // Добавляем домены которые не отвечают в BrokenList
                BrokenList.Add(domain.ToString());
            }
        }
        catch (Exception ex)
        {
            // Добавляем таймаут домены (и вообще любые ошибочные ответы) в BrokenList
            BrokenList.Add(domain);
        }
    });
}
catch (Exception outerEx)
{
    // Обработка ошибок внешнего блока try-catch
    throw new Exception(outerEx.Message + "\r\n" + outerEx.StackTrace);
}
 

Кто просматривает тему: (Всего: 0, Пользователи: 0, Гости: 0)