Технологии
Решено
Проблема 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 — 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 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());
}
}
}
}
// редактор этого сайта очень не дружит с простым текстом ))) форматирование студии теряется, увы
-
для начала разберитесь в чем суть изменений вот в таком варианте )))
(все работает, в тч с русскими именами, но просто ломает по строкам опять разбивать, просто скопируйте весь код в студию, там легче отформатировать красиво)
(проверил — не факт что скопируется хорошо ((( подчищаю )
(подправил, получилась ошибка, устраняю )))
(последняя правка, правильно говорят что лень=двигатель прогресса ))) чуть чуть упростил работу по выбору урл для проверки отработки с исключением и без )
(и слегка продолжил на тему обработки ;))) )
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 =
{
@«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());
}
}
}
}
Лучший ответ по мнению автора
Похожие вопросы