Проблема следующем: автоматизирую post-запрос на сайт, на котором присутствуюет форма, состоящяя как бы из 2 частей: первый этап: http://site.ru/script.cgi?step=registration тут форма <form action=''> ввожу некоторые данные (2 параметра), далее нажимаю кнопку: идет пренаправление на второй этап, адрес: http://site.ru/script.cgi?step=registration¶m1=bla¶m2=bla тут нужно ввести в форму <form action='srcipt.cgi' method='post'> много данных и нажать submit. руками все получается ) теперь программа: делаю запрос HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("http://site.ru/script.cgi"); req.Method = "POST"; ... итд. саму методику формирования запроса выполняю правильно. передаю параметры: string Params = "step=registration¶m1=bla¶m2=bla¶m3=blabla¶mN=blabla"; получаю ответ. в любых вариациях приходит не результат выполнения моего запроса, а 2 этап регистрации, т.е. страница, доступная по адресу http://site.ru/script.cgi?step=registration¶m1=bla¶m2=bla, без каких-либо изменений. Не подскажете, в чем может быть проблема, и как отправлять запросы на страницы, сформированные скриптом?
Используй сниффер и полностью воспроизведи действия браузера в своей программе. Также, целиком возможно (но скорее маловероятно), что нужно сначала перейти по адресу http://site.ru/, установить кукисы, а уже потом переходить на http://site.ru/script.cgi?step=registration.
спасибо, снифер помог. я оказывается забыл один параметр передать... сделано как то хитро. авторизацию я прохожу нормально, через кукисы как раз-таки.
вопрос такого плана: а почему пост запрос так долго идет? инет вроде быстрый, через браузер гораздо быстрее все происходит. можно ли как нибудь ускорить ?
Какой компонент используешь для передачи POST запроса? если используешь библиотеку Winsock, - то выложи свой код. С другой стороны, - возможно ты не используешь сжатие данных. Браузер чаще всего как раз делает запрос на получение сжатых данных от сервака, размер которых уменьшен от несжатого варианта обычно в несколько раз.
HttpWebRequest req = (HttpWebRequest)HttpWebRequest.Create("https://www.site.ru/script.cgi"); req.Method = "POST"; req.ContentType = "application/x-www-form-urlencoded"; req.CookieContainer = cookie; byte[] SomeBytes = null; string FormParams = "param1=bla¶m2=blabla"; SomeBytes = Encoding.GetEncoding(1251).GetBytes(FormParams); req.ContentLength = SomeBytes.Length; Stream newStream = req.GetRequestStream(); newStream.Write(SomeBytes, 0, SomeBytes.Length); newStream.Close();
и заодно еще вопрос: как автоматизировать загрузку файла? имеется <form action="script.cgi" method="post"> <input type="file"> </form> Как имитировать программно загрузку на сервер выбранного файла?
На сокетах и с сжатием данных сделай, в разы быстрее будет.Вот тебе примерчик: P.S Гугл POST запрос не обрабатывает (у него GET), написал как пример.И да, за работоспособность кода не отвечаю ибо писал в блокноте и не компилил. P.P.S С GET запросом там намного проще, гугли.
а если авторизация на сайте происходит в 3 этапа (2 раза редирект - HTTP 302, а потом только конечная ссылка), то мне надо создавать 3 сокета и кидать 3 запроса, да ?
ТС не слушай эту херню с сокетами, лучше пожертвовать 10 милисекундами и получить удобство использования чем заниматься парсингом ответа на Location. Все что необходимо это HttpWebRequest и HttpWebResponse, для авторедиректа AllowAutoRedirect = true.
у меня задача такая: сделать 2 функции. первая будет проходить авторизацию. вторая должна получить доступ к закрытым страницам. как мне сделать так, чтобы вызвав один раз авторизацию, я мог всегда заходить на защищенные страницы? как я понимаю, надо сохранить куки... но у меня их почему то не приходит. проверяю response.Header["Set-Cookie"] - пусто...
вроде бы сделал... надо было AllowAutoRedirect=false поставить, чтобы он кукисы ловить успевал. Сохраняю их в строку просто, и использую в других функциях...