Аннотация:
Статья рассказывает об организации взаимодействия между сайтами, программном заполнении и отправке Web-форм и использовании класов HttpWebRequest и HttpWebResponse.
Почитал статью на сайте первоисточнике, странно зачем такие мучения если есть Watin? Для эмуляции действия пользователя подходит идеально, если конечно не делать эту эмуляцию в промышленных масштабах, но там другие проблемы возникнут.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re: Взаимодействие с другими сайтами через HTTP (HttpWebRequ
НА>Авторы: НА> Немиро Алексей
НА>Аннотация: НА>Статья рассказывает об организации взаимодействия между сайтами, программном заполнении и отправке Web-форм и использовании класов HttpWebRequest и HttpWebResponse.
Странно, но при использовании HttpWebResponse myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse(); выдается ошибка: "Удаленный сервер возвратил ошибку: (407) Требуется проверка подлинности посредника."
Пробовал с прокси и без. У прокси задавал рабочие логин и пароль (настройки ИЕ). Не помогло
Re: Взаимодействие с другими сайтами через HTTP (HttpWebRequ
Спасибо, мне статья понравилась
Понравилась на столько, что я "не отходя от кассы" написал по её мотивам простенькую утилитку для себя, чтобы просматривать статистику посещения своего ЖЖ. Вроде все работает
Жалко, что три месяца назад я ничего не знал про Вашу статью. Как раз на работе возникла задача посылать отчеты с территории заказчика через Web-интерфейс его почтовой системы… Эх…
Программист — это не тот, кто пишет программы, а тот, чьи программы работают.
Re: Взаимодействие с другими сайтами через HTTP (HttpWebRequ
От:
Аноним
Дата:
07.07.08 12:46
Оценка:
Здравствуйте, Немиро Алексей, Вы писали:
Почитал статью на сайте. Решил написать отправку большого файла на сайт. И возник вопрос:
как узнать что некоторые данные уже отосланы. Тоесть если читать файл по частям и отправлять на
сервер то значения прогресс бара будут неверны.
fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
...
i = fs.Read(buf, 0, buf.Length);
myHttpWebRequest.GetRequestStream().Write(buf, 0, buf.Length);
this.progressBar1.Value++;
Re: Взаимодействие с другими сайтами через HTTP (HttpWebRequ
Отличная статья для новичка! Спасибо!
Я бы еще добавил, что без инициализации CookieContainer в HTTPresponce куки будут просто отсутствовать. Обратившись к справке видим, что это сделано в целях безопасности.
Соответственно после инициализации конструктора
myHTTTPrequest.CookieContainer = new CookieContainer();
куки появляются в принятом заголовке.
Re: Взаимодействие с другими сайтами через HTTP (HttpWebRequ
Мне статья сильно помогла, спасибо. Как раз, ковырялся с тем, чтобы наладить авторизацию на Яндексе — нужно программно оттуда ленту своих RSS получать. Без этой статьи я бы хрен знает сколько с этой авторизацией провозился.
Однако, код пришлось доточить, т.к. в представленном виде он не работал. Да и лишние места в нем есть.
Возможно, все это потому, что с момента написания статьи прошло много времени.
Не работало из-за того, что в указанном коде передача куков осуществлялась через заголовки, добавляемые в объекты запросов. А нужно так:
myHttpWebRequest.CookieContainer = new System.Net.CookieContainer();
myHttpWebRequest.CookieContainer.Add( myHttpWebResponse.Cookies );
Оказались и лишние куски. Например, вполне можно обойтись без первого и последнего запросов, и так работает.
Метку времени можно и не передавать. Способ использования параметра Location устарел.
В общем, на сегодняшний день необходимый и достаточный код для получения заданной страницы с Яндекса с предварительной авторизацией такой:
string GetArticlesHtml(){
string sTest = "";
HttpWebResponse myHttpWebResponse = null;
HttpWebRequest myHttpWebRequest = null;
string sAccept =
"image/gif, image/x-xbitmap, image/jpeg, " +
"image/pjpeg, application/x-shockwave-flash, " +
"application/vnd.ms-excel, " +
"application/vnd.ms-powerpoint, application/msword, */*";
string sUserAgent =
"Mozila/4.0 (compatible; MSIE 6.0; " +
"Windows NT 5.1; SV1; MyIE2;";
string sLogin = "***";
string sPassword = "***";
string sTargetUrl = "http://lenta.yandex.ru/unread.xml";
//Отправка логина и пароля, делать мы это будем методом POST.
//Если вы
//сделаете все правильно, то сервер возвратит код 302, в противном
//случае – код 200, со страницей, содержащей информацию об ошибке,
//либо форму авторизации.
myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create(
"http://passport.yandex.ru/passport?mode=auth" );
myHttpWebRequest.Method = "POST";
myHttpWebRequest.UserAgent = sUserAgent;
myHttpWebRequest.Accept = sAccept;
myHttpWebRequest.Headers.Add("Accept-Language", "ru");
myHttpWebRequest.CookieContainer = new System.Net.CookieContainer();
myHttpWebRequest.ContentType = "application/x-www-form-urlencoded";
//Очень важно не забыть указать значение False свойства
//AllowAutoRedirect. Если этого не сделать, то, при получении кода
//301/302, HttpWebRequest автоматически перейдет на указанную в
//заголовках страницу, при этом могут потеряться важные данные,
//например, cookie, и, следовательно, сервер не пустит нас на
//нужную страницу.
myHttpWebRequest.AllowAutoRedirect = false;
// передаем параметрыstring sQueryString =
"retpath=" +
System.Web.HttpUtility.UrlEncode(sTargetUrl) +
"&login=" + System.Web.HttpUtility.UrlEncode(sLogin) +
"&passwd=" + System.Web.HttpUtility.UrlEncode(sPassword);
byte[] ByteArr =
System.Text.Encoding.GetEncoding(1251).GetBytes(sQueryString);
myHttpWebRequest.ContentLength = ByteArr.Length;
myHttpWebRequest.GetRequestStream().Write(ByteArr, 0, ByteArr.Length);
// выполняем запрос
myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
//sTest = GetResponseText( myHttpWebResponse );
//Переход на целевую страницу
myHttpWebRequest = (HttpWebRequest)HttpWebRequest.Create( sTargetUrl );
myHttpWebRequest.Referer =
"http://passport.yandex.ru/passport?mode=auth";
myHttpWebRequest.UserAgent = sUserAgent;
myHttpWebRequest.Accept = sAccept;
myHttpWebRequest.Headers.Add("Accept-Language", "ru");
myHttpWebRequest.CookieContainer = new System.Net.CookieContainer();
myHttpWebRequest.CookieContainer.Add( myHttpWebResponse.Cookies );
myHttpWebRequest.ContentType = "text/plain";
// выполняем запрос
myHttpWebResponse = (HttpWebResponse)myHttpWebRequest.GetResponse();
sTest = GetResponseText( myHttpWebResponse );
return sTest;
}
string GetResponseText( HttpWebResponse response ){
string sResult = null;
using( Stream resst = response.GetResponseStream() ){
sResult = new StreamReader(resst, Encoding.GetEncoding(1251)).ReadToEnd();
}
return sResult;
}
Принципиальный момент с авторизацией на Яндексе в том, что она работает только с переадесацией после передачи логина и пароля. То есть если убрать параметр retpath в первом запросе, то второй запрос вернет ошибку в любом случае, даже если первый отработал нормально, вернув страницу с результатом успешной авторизации.