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

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
Запускаю через parallelfor httpget запрос и некоторые потоки отваливаются с ошибкой ResourceDownloader.GetResult превышен таймаут... Таймаут больше 50000 выставлять нет смысла, прокси из проксичекера. Try Catch не дал результата. Каким образом отловить ошибки http, чтоб поток не отваливался? xNet пока не рассматриваю, 2 года ничего не меняется.
 

one

Client
Регистрация
22.09.2015
Сообщения
6 833
Благодарностей
1 275
Баллы
113
Данная сообщение означает что превышен timeout загрузки страницы (элемента, не знаю что Вас там) Указано же. т.е. или увеличиваем таймаут или берем другой, рабочий и быстрый прокси.
 

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
Данная сообщение означает что превышен timeout загрузки страницы (элемента, не знаю что Вас там) Указано же. т.е. или увеличиваем таймаут или берем другой, рабочий и быстрый прокси.
Дело в том, что из за этой ошибки теряются данные, увеличение таймаута не решает проблему, а с htmlagilitypack все останавливается.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
У меня есть машина, она не едет. Поменял электронику - всё равно не едет. ЧТо не так?
Да хоть что! Вплоть до того, что машина, например, стиральная.
 
  • Спасибо
Реакции: Сибиряк

one

Client
Регистрация
22.09.2015
Сообщения
6 833
Благодарностей
1 275
Баллы
113

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113
Дело в том, что из за этой ошибки теряются данные, увеличение таймаута не решает проблему, а с htmlagilitypack все останавливается.
Если увеличение таймаута не помогает, значит причина в следующем:
  • Слабый и-нет канал \ Плохой прокси
  • Сайт нестабильно работает
Это не значит, что поток отваливается или это ошибка программы - это нормальное поведение в случае, если не удалось получить ответ от сайта.
Теперь Ваша задача его обработать.

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

one

Client
Регистрация
22.09.2015
Сообщения
6 833
Благодарностей
1 275
Баллы
113

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113
  • Спасибо
Реакции: Hannes и one

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
у него запросы через parallelfor.
Но зачем здесь выкладывать код, люди догадаются как он выглядит и где проблемное место
 

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
у него запросы через 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

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
У меня есть машина, она не едет. Поменял электронику - всё равно не едет. ЧТо не так?
Да хоть что! Вплоть до того, что машина, например, стиральная.
Из за такого свинства, как ты наклацал, сложно гуглить нужное и еще сложнее потом это все фильтровать по форуму.
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
что такое res1? Не вижу, где оно объявляется
 

doc

Client
Регистрация
30.03.2012
Сообщения
8 684
Благодарностей
4 641
Баллы
113
Из за такого свинства, как ты наклацал, сложно гуглить нужное и еще сложнее потом это все фильтровать по форуму.
Ты прав. Надо было вобще написать "Экстрасенсы в отпуске" и забыть. И пусть ребята и дальше бы с тебя клещами крупицы инфы доставали, тратя своё время
 

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
что такое res1? Не вижу, где оно объявляется
res1 результат запроса, да, это ошибка которую упустил редактируя код для постинга сюда. Дело не в этом, дело в том, что ты не вкурсе, что ошибка такая существует при таймауте и в коде все работает. Прочекано два десятка тысячь адресов за 15 мин.
 

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113
у него запросы через parallelfor.
Что-то я затупил, не заметил.

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

SergSh

Client
Регистрация
10.05.2017
Сообщения
541
Благодарностей
395
Баллы
63
Что-то я затупил, не заметил.


В целом, очень похоже на баг т.к. трай-кэтч не обрабатывается даже без параллельных запросов.
Хотя я точно помню, что эта обёртка всегда работала.
Там без разницы какой таймаут выставлять, при превышении ошибка лезет.
 

ibred

Client
Регистрация
04.04.2015
Сообщения
3 835
Благодарностей
3 552
Баллы
113
Там без разницы какой таймаут выставлять, при превышении ошибка лезет.
Собственно, после запроса работа не останавливается, в случае таймаута - поток продолжает работу, его не выбивает.
Можно сделать такую проверку:
C#:
if (string.IsNullOrWhiteSpace(res)) {
// Берем новый прокси и делаем новый запрос
}
 

Onegogh

Client
Регистрация
23.12.2015
Сообщения
51
Благодарностей
12
Баллы
8
ребят, я конечно понимаю что опоздал на 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);
}
 

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