Технологии

Решено

Проблема httpWebRequest - вопрос №83528

Здравствуйте, возникла следующая проблема: делаю запрос к серверу через httpWebRequest

static void Main(string[] args)

 { 

          var httpWebRequest = (HttpWebRequest)WebRequest.Create(«www.google.ru/sorry/Captcha?continue=http%3A%2F%2Fwww.google.ru%2Fsearch%3Fq%3D%25D1%2581%25D0%25B5%25D0%25BE%25D0%25BF%25D1%2583%25D0%25BB%25D1%258C%25D1%2582%25D1%2583%25D1%2581%26channel%3Dlinkdoctor&id=10783499217868175628&captcha=2119579&submit=%D0%9E%D1%82%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D1%82%D1%8C»);           

httpWebRequest.AllowAutoRedirect = true;   

httpWebRequest.CookieContainer = new CookieContainer();   

 if (Cooks != null)

{              

httpWebRequest.CookieContainer.Add(Cooks); 

}           

HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();         httpWebResponse.Cookies = httpWebRequest.CookieContainer.GetCookies(httpWebRequest.RequestUri);   

{            

  Cooks.Add(httpWebResponse.Cookies);

Stream stream = httpWebResponse.GetResponseStream(); 

if (stream != null) 

 

 var reader = new StreamReader(stream); 

 Console.Write(reader.ReadToEnd());  

  } 

}

Возникает исключение и соединение закрывается.

Как можно проигнорировать ошибку и получить данные с сервера?

май 24, 2011 г.

  • Всего ответов: 3

  • Константин Жук - аватарка

    Константин Жук

    1-й в

    если до завтрашнего вечера ни кто не откликнется, а проблема не будет решена — обращайтесь в чат, попробуем разобраться. раньше к сожалению не смогу, пока занят

    май 24, 2011 г.
  • Константин Жук - аватарка

    Константин Жук

    1-й в

    1 — C# некоторые комбинации символов типа /n (новая строка) обрабатывает как служебные. с учетом того что типичные URL содержат символ / рекомендую использовать такой формат:

    @«текст строки в котором /n просто /n»

    в строке после знака @ служебные комбинации символов игнорируются

    2 — url http запроса следуе начинать с префикса протокола, в данном случае это должно выглядеть примерно так:

    @«http://www.google.ru...<продолжение строки запроса>»

    3  - по стандарту языка HttpWebRequest и httpWebRequest уже будут различными именами, но читаемость очень сильно ухудшается, все таки не следует в качестве идентефикатора переменной использовать имя типа, лучше смысловое изменеие. вместо

    var httpWebRequest = (HttpWebRequest)WebRequest.Create(...

    стоит писать что то типа такого

    var MyhttpWebRequest = (HttpWebRequest)WebRequest.Create(...

    или

    var SpecialRequest = (HttpWebRequest)WebRequest.Create(...

    тоже и здесь

    HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse(...

    4 — не понятно происходение Cooks, код в таком виде естественно не компилируется

    5 — в сообщении исключения указано что сервер возвращает код 503 — «сервер недоступен», хотя просто в браузере ссылка открывается но там возникает форма воода ответа на капчу. исключение вызвано именно этим, для проверки создаем урл на заведомо не существующую страницу и получаем исклучение с кодом возврата 404, что соответвует действительности. что бы избежать аварийного завершения программы следует писать свой обработчик исключений, но за подробностями обращайтесь к msdn )))… (за отдельную плату можем позаниматься вместе )))

    вот в таком виде код компилируется и исполняется без ошибок:

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Net;

    using System.IO;

    namespace ConsoleApplication1 {

    class Program {

    static void Main(string[] args)

    {

    string problemUrl = @«www.google.ru/sorry/Captcha?continue=http%3A%2F%2Fwww.google.ru%2Fsearch%3Fq%3D%25D1%2581%25D0%25B5%25D0%25BE%25D0%25BF%25D1%2583%25D0%25BB%25D1%258C%25D1%2582%25D1%2583%25D1%2581%26channel%3Dlinkdoctor&id=10783499217868175628&captcha=2119579&submit=%D0%9E%D1%82%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D1%82%D1%8C»; 

    string MyUrl = @«yandex.ru»;

    string _404_url = @«yandex.ru/blablabla-page.html»;

    var MyWebRequest = (HttpWebRequest)WebRequest.Create(MyUrl);

    MyWebRequest.AllowAutoRedirect = true;

    MyWebRequest.CookieContainer = new CookieContainer();

    //if (Cooks != null)        // ?????????

    //{

    //    MyWebRequest.CookieContainer.Add(Cooks);

    //}

    HttpWebResponse MyWebResponse = (HttpWebResponse)MyWebRequest.GetResponse();

    MyWebResponse.Cookies = MyWebRequest.CookieContainer.GetCookies(MyWebRequest.RequestUri);

    //{

    //    Cooks.Add(MyWebResponse.Cookies);

    //}

    Stream stream = MyWebResponse.GetResponseStream();

    if (stream != null)

    {

    var reader = new StreamReader(stream);

    Console.Write(reader.ReadToEnd());

    }

    }

    }

    }

    // редактор этого сайта очень не дружит с простым текстом ))) форматирование студии теряется, увы

    май 25, 2011 г.
  • Константин Жук - аватарка

    Константин Жук

    1-й в

    для начала разберитесь в чем суть изменений вот в таком варианте )))

    (все работает, в тч с русскими именами, но просто ломает по строкам опять разбивать, просто скопируйте весь код в студию, там легче отформатировать красиво)

    (проверил — не факт что скопируется хорошо ((( подчищаю )

    (подправил, получилась ошибка, устраняю )))

    (последняя правка, правильно говорят что лень=двигатель прогресса ))) чуть чуть упростил работу по выбору урл для проверки отработки с исключением и без )

    (и слегка продолжил на тему обработки ;))) )

    using System;

    using System.Collections.Generic;

    using System.Linq;

    using System.Text;

    using System.Net;

    using System.IO;

    using System.Windows.Forms;

    namespace ConsoleApplication1

    {

    class Program

    {

    static void Main(string[] args)

    {

    string[] urls =

    {

    www.google.ru/sorry/Captcha?continue=http%3A%2F%2Fwww.google.ru%2Fsearch%3Fq%3D%25D1%2581%25D0%25B5%25D0%25BE%25D0%25BF%25D1%2583%25D0%25BB%25D1%258C%25D1%2582%25D1%2583%25D1%2581%26channel%3Dlinkdoctor&id=10783499217868175628&captcha=2119579&submit=%D0%9E%D1%82%D0%BF%D1%80%D0%B0%D0%B2%D0%B8%D1%82%D1%8C»,

    @«yandex.ru/blablabla-page.html»,

    yandex.ru»

    };

    HttpWebRequest MyWebRequest;

    HttpWebResponse MyWebResponse = null;

    Stream stream = null;

    MyWebRequest = (HttpWebRequest)WebRequest.Create(urls[0]);

    MyWebRequest.AllowAutoRedirect = true;

    MyWebRequest.CookieContainer = new CookieContainer();

    //if (Cooks != null) // ?????????

    //{

    //    MyWebRequest.CookieContainer.Add(Cooks);

    //}

    try

    {

    MyWebResponse = (HttpWebResponse)MyWebRequest.GetResponse(); // exception ??? 503 —  captcha ???

    MyWebResponse.Cookies = MyWebRequest.CookieContainer.GetCookies(MyWebRequest.RequestUri);

    //{

    //    Cooks.Add(MyWebResponse.Cookies);

    //}

    stream = MyWebResponse.GetResponseStream();

    }

    catch (WebException мое_исключение_в_котором_информация_об_ошибке)

    {

    bool прочитали_книжки = false;

    if (прочитали_книжки)

    {

    MessageBox.Show(мое_исключение_в_котором_информация_об_ошибке.Message);

    }

    else

    {

    MessageBox.Show(«Книжки надо читать! ;)))»);

    }

    }

    if (stream != null)

    {

    var reader = new StreamReader(stream);

    Console.Write(reader.ReadToEnd());

    }

    }

    }

    }

    май 25, 2011 г.
    Ответ понравился автору
    Лучший ответ по мнению автора

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

Решено

Как принудительно удалить объект в C#?

август 3, 2012 г.

Технологии

Решено

Поток не выводит MessageBox сообщение

июль 21, 2012 г.

Технологии

Решено

Заполнение dataGridView данными из array

ноябрь 25, 2011 г.

Технологии