Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 11.02.2015, 13:54   #1
Yoh
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 37
Печаль c# webclient не получает ответ

Всем доброго времени суток. Такая беда, в цикле получаю странички сайта. И вот буквально вчера обнаружилась такая беда, webclient получает только 2 странички, на третей виснет(как я понял, ожидает ответа сервера). Делается это следующим кодом
Код:
string AuctionsCount = foo.Children[2].InnerText;
            AuctionsCount = AuctionsCount.Remove(AuctionsCount.Length - 2);
            for(int j = 1; j < Convert.ToInt32(AuctionsCount); j++)
            {
                Thread.Sleep(1000);
                using (wc MyWebClient = new wc())
                {
                    MyWebClient.Headers.Add("Host", "www.testserver.ru");
                    MyWebClient.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0");
                    MyWebClient.Headers.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
                    MyWebClient.Headers.Add("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3");
                    MyWebClient.Headers.Add("Accept-Encoding", "gzip, deflate");
                    HtmlAgilityPack.HtmlDocument TablePage = new HtmlAgilityPack.HtmlDocument();
                    Console.WriteLine("Все зашибись");
                    TablePage.Load(MyWebClient.OpenRead("https://www.testserver.ru/trade/past/?page=" + j + "&limit=100&price_from=500000&end_registration_from=" + maskedTextBox1.Text + "&end_registration_to=" + maskedTextBox2.Text /*и дальше длиннючий запрос*/"));
                    HtmlNodeCollection Auctions = TablePage.DocumentNode.SelectNodes("My xpath");
                    for (int i = 1; i < Auctions.Count; i++ )
                    {
                         DoWork();
                    }
                }
            }
            isProcessed = false;
            buttonsOn();
Из за gzip пришлось делать небольшую дописку к webclient, иначе выводил каракули.
Код:
    class wc: WebClient
    {
        protected override WebRequest GetWebRequest(Uri address)
        {
            HttpWebRequest request = base.GetWebRequest(address) as HttpWebRequest;
            request.AutomaticDecompression = DecompressionMethods.Deflate | DecompressionMethods.GZip;
            return request;
        }
    }
Задержка в секунду стоит потому что в противном случае вылезает "Базовое соединение закрыто: Соединение было неожиданно закрыто".То что сервер перестает отвечать на 3 странице, это ошибка в коде или это такое нехорошое поведение сервера, к которому обращаюсь? Что может вызвать подобное поведение? Игнорировать странички мне никак нельзя, на них информация(

Последний раз редактировалось Yoh; 11.02.2015 в 13:59. Причина: Длиннющий запрос
Yoh вне форума Ответить с цитированием
Старый 11.02.2015, 14:04   #2
lomastr_
Форумчанин
 
Регистрация: 16.01.2015
Сообщений: 672
По умолчанию

попробуйте увеличить задержку, вполне вероятно что сервер и не отдает с такой частотой, понимая что это бот.
lomastr_ вне форума Ответить с цитированием
Старый 11.02.2015, 14:22   #3
Yoh
Пользователь
 
Регистрация: 31.05.2009
Сообщений: 37
По умолчанию

К сожалению, не в задержке дело. Сейчас поднял до 5 секунд, та же ситуация. Дело в том что до этого была другая проблема с форматом. Пока вебклиент не обернул, каракули шли, но они шли стабильно с задержкой в 800(

Проблема как раз в обертке. HttpWebRequest дает возможность обработать GZip, но в то же время, больше 2 на сайт отправить нельзя. Буду разбираться с чем работает webclient по умолчанию, и как это по умолчанию заставить работать с gzip

--

Проблема, как оказалось, проявляет себя при попытке разархивировать страничку, т.е:
Код:
            for(int j = 1; j < Convert.ToInt32(AuctionsCount); j++)
            {
                Thread.Sleep(600);
                using (WebClient MyWebClient = new WebClient())
                {
                    MyWebClient.Headers.Add("Host", "www.testserver.ru");
                    MyWebClient.Headers.Add("User-Agent", "Mozilla/5.0 (Windows NT 6.2; WOW64; rv:35.0) Gecko/20100101 Firefox/35.0");
                    MyWebClient.Headers.Add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8");
                    MyWebClient.Headers.Add("Accept-Language", "ru-RU,ru;q=0.8,en-US;q=0.5,en;q=0.3");
                    MyWebClient.Headers.Add("Accept-Encoding", "gzip, deflate");
                    HtmlAgilityPack.HtmlDocument TablePage = new HtmlAgilityPack.HtmlDocument();
                    Console.WriteLine("Все зашибись");
                    GZipStream a = new GZipStream(MyWebClient.OpenRead("%запрос%"), CompressionMode.Decompress);
                    TablePage.Load(a);
                 }
            }
То есть подобный код на TablePage.Load(a); уже виснет на 3 запросе...Но причем тут разбор потока, ведь это делается, по сути, уже дома о_о

--

Помог Сам Самыч. Просто некий простофиля не разбирается в этих ваших стримах. Если чистить за собой чем то вроде такого:
Код:
using (GZipStream a = new GZipStream(MyWebClient.OpenRead("%запрос%"), CompressionMode.Decompress))
{
dowork();
}
то никаких проблем не происходит. Прошу прощения у всех, кто читал это

Последний раз редактировалось Yoh; 11.02.2015 в 16:50. Причина: Решение
Yoh вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Загрузка файлов WebClient koljsch C# (си шарп) 0 06.03.2014 00:46
Download file Webclient Cpluser C# (си шарп) 1 16.07.2013 22:19
C# WebClient ошибка использования DownloadString Claster Помощь студентам 3 01.11.2012 10:56
WebClient исключение MyXa Общие вопросы .NET 4 02.02.2011 13:47
HTTP Не получает ответ AngelOfDeath Работа с сетью в Delphi 3 23.08.2009 13:06