Как программно заполнить форму и «отправить» веб-страницу? - PullRequest
32 голосов
/ 26 августа 2008

Используя C # и ASP.NET, я хочу программно заполнить некоторые значения (4 текстовых поля) на веб-странице (форма), а затем «отправить» эти значения. Как мне это сделать?

Редактировать: Уточнение: есть служба (www.stopforumspam.com), где вы можете отправить ip, имя пользователя и адрес электронной почты на их странице добавления. Я хочу иметь возможность создать ссылку / кнопку на странице моего сайта, которая будет заполнять эти значения и отправлять информацию без необходимости копировать / вставлять их и нажимать кнопку отправки.

Дополнительные пояснения: как автоматические спам-боты заполняют формы и нажимают кнопку отправки, если они были написаны на C #?

Ответы [ 6 ]

46 голосов
/ 26 августа 2008

Вы можете увидеть пример этого здесь: http://en.csharp -online.net / HTTP_Post

По сути, код будет выглядеть примерно так:

WebRequest req = WebRequest.Create("http://mysite/myform.aspx");
string postData = "item1=11111&item2=22222&Item3=33333";

byte[] send = Encoding.Default.GetBytes(postData);
req.Method = "POST";
req.ContentType = "application/x-www-form-urlencoded";
req.ContentLength = send.Length;

Stream sout = req.GetRequestStream();
sout.Write(send, 0, send.Length);
sout.Flush();
sout.Close();

WebResponse res = req.GetResponse();
StreamReader sr = new StreamReader(res.GetResponseStream());
string returnvalue = sr.ReadToEnd();
4 голосов
/ 05 декабря 2011

Вы можете использовать метод UploadValues ​​в WebClient - все, что ему требуется, - это передать URL-адрес и NameValueCollection. Это самый простой подход, который я нашел, и в документации на MS есть хороший пример:
http://msdn.microsoft.com/en-us/library/9w7b4fz7.aspx

Вот простая версия с некоторой обработкой ошибок:

var webClient = new WebClient();
Debug.Info("PostingForm: " + url);
try
{
     byte [] responseArray = webClient.UploadValues(url, nameValueCollection);
     return new Response(responseArray, (int) HttpStatusCode.OK);
}
catch (WebException e)
{
     var response = (HttpWebResponse)e.Response;
     byte[] responseBytes = IOUtil.StreamToBytes(response.GetResponseStream());
     return new Response(responseBytes, (int) response.StatusCode);
}  

Класс Response - это простая оболочка для тела ответа и кода состояния.

1 голос
/ 26 августа 2008

Просмотрите исходный код страницы и используйте класс WebRequest для публикации. Не нужно водить IE. Просто выясните, что IE отправляет на сервер, и скопируйте это. Использование такого инструмента, как Fiddler, сделает это еще проще.

0 голосов
/ 26 октября 2016

Вы можете отправить сообщение / получить запрос несколькими способами. Различные типы библиотек здесь, чтобы помочь. Я обнаружил, что сбивает с толку , чтобы выбрать, какой из них мне следует использовать и каковы различия среди них.

После переполнения стека это лучший ответ, который я нашел 1008 *. эта тема объясняет все

https://stackoverflow.com/a/4015346/1999720

0 голосов
/ 11 июня 2015

Где вы кодируете строку:

Encoding.Default.GetBytes (PostData);

Используйте Ascii вместо Google Apis:

Encoding.ASCII.GetBytes (PostData);

это делает ваш запрос таким же, как и эквивалентный запрос "curl --data" ... "[url]"

0 голосов
/ 20 февраля 2013

У меня была ситуация, когда мне нужно было публиковать свободный текст из текстовой области html программно, и у меня были проблемы, когда я получал <br /> в своем списке параметров, который я строил.

Мое решение состояло в том, чтобы заменить теги br символами перевода строки и htmlencoding просто для безопасности.

Regex.Replace( HttpUtility.HtmlDecode( test ), "(<br.*?>)", "\r\n" ,RegexOptions.IgnoreCase);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...