HTTP Post в консольном приложении C # не возвращает то же самое, что запрос браузера - PullRequest
3 голосов
/ 13 февраля 2009

У меня есть консольное приложение C # (платформа .NET 2.0), которое отправляет HTTP-сообщение, используя следующий код:

StringBuilder postData = new StringBuilder(100);
postData.Append("post.php?");
postData.Append("Key1=");
postData.Append(val1);
postData.Append("&Key2=");
postData.Append(val2);

byte[] dataArray = Encoding.UTF8.GetBytes(postData.ToString());

HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create("http://example.com/");
httpRequest.Method = "POST";
httpRequest.ContentType = "application/x-www-form-urlencoded";

httpRequest.ContentLength = dataArray.Length;
Stream requestStream = httpRequest.GetRequestStream();
requestStream.Write(dataArray, 0, dataArray.Length);
requestStream.Flush();
requestStream.Close();

HttpWebResponse webResponse = (HttpWebResponse)httpRequest.GetResponse();

if (httpRequest.HaveResponse == true) {
  Stream responseStream = webResponse.GetResponseStream();
  StreamReader responseReader = new System.IO.StreamReader(responseStream, Encoding.UTF8);
  String responseString = responseReader.ReadToEnd();
}

Выходы из этого:
webResponse.ContentLength = -1
webResponse.ContentType = text / html
webResponse.ContentEncoding пусто

responseString - это HTML с заголовком и телом.

Однако, если я отправлю тот же URL-адрес в браузер (http://example.com/post.php?Key1=some_value&Key2=some_other_value),, я получу небольшой фрагмент XML, например:

<?xml version="1.0" ?>
<RESPONSE RESULT="SUCCESS"/>

без того же HTML, что и в приложении. Почему ответы такие разные? Мне нужно проанализировать возвращенный результат, который я не получаю в HTML. Нужно ли менять способ публикации сообщения в приложении? У меня нет контроля над кодом на стороне сервера, который принимает сообщение.

Ответы [ 7 ]

9 голосов
/ 13 февраля 2009

Если вы действительно должны использовать HTTP-метод POST, у вас есть пара ошибок. Во-первых, эта строка:

postData.Append("post.php?");

неверно. Вы хотите отправить в post.php, вы не хотите публиковать значение "post.php?" на страницу. Просто удалите эту строку полностью.

Этот кусок:

... WebRequest.Create("http://example.com/");

нужно post.php добавить к нему, так что ...

... WebRequest.Create("http://example.com/post.php");

Опять же, это предполагает, что вы на самом деле должны POST заходить на указанную страницу вместо GET. Если предполагается, что вы используете GET, то применяются другие уже предоставленные ответы.

3 голосов
/ 14 февраля 2009

Вам понадобится инструмент HTTP sniffer, например Fiddler , и сравните заголовки, отправляемые из вашего приложения, с заголовками, отправляемыми браузером. Там будет что-то другое, что заставляет сервер возвращать другой ответ. Когда вы настраиваете свое приложение для отправки того же сообщения, которое отправляет браузер, вы должны получить тот же ответ. (Это может быть пользовательский агент, файлы cookie, что угодно, но что-то определенно отличается.)

2 голосов
/ 13 февраля 2009

Я видел это в прошлом.

При запуске из браузера «User-Agent» в заголовке - «Mozilla ...».

Когда вы запускаете программу, она отличается и обычно зависит от используемого языка.

1 голос
/ 13 февраля 2009

Я думаю, вам нужно использовать запрос GET вместо POST. Если используемый вами URL имеет значения строки запроса (например,? Key1 = some_value & Key2 = some_other_value), он ожидает GET. Вместо добавления значений записей в ваш веб-запрос, просто поместите эти данные в строку запроса.

HttpWebRequest httpRequest = (HttpWebRequest)WebRequest.Create("http://example.com/?val1=" + val1 + "&val2=" + val2);
httpRequest.Method = "GET";
httpRequest.ContentType = "application/x-www-form-urlencoded";
....

Итак, результат, который вы получаете, отличается, когда вы POST-данные из своего приложения, потому что серверный код имеет другой вывод, когда он не может прочитать данные, которые он ожидает в строке запроса.

1 голос
/ 13 февраля 2009

В вашем коде вы указываете метод POST, который отправляет данные в файл PHP без помещения данных в веб-адрес. Когда вы помещаете информацию в адресную строку, это не метод POST, а метод GET. Название может сбивать с толку, но GET просто означает, что данные отправляются в файл PHP через веб-адрес, а не за кулисами, а не то, что он должен получать какую-либо информацию. Когда вы вводите адрес в браузере, он использует GET.

Создайте простую HTML-форму и укажите POST в качестве метода, а URL-адрес - в качестве действия. Вы увидите, что информация отправляется без появления в адресной строке.

Затем сделайте то же самое, но укажите GET. Вы увидите информацию, которую вы отправили в адресной строке.

0 голосов
/ 13 февраля 2009

Форма ожидает печенье? Это еще одна возможная причина, по которой он работает в браузере, а не в консольном приложении.

0 голосов
/ 13 февраля 2009

Я полагаю, что проблема связана с тем, как ваши заголовки настроены для WebRequest.

Я видел странные случаи, когда попытка смоделировать браузер путем изменения заголовков в запросе имеет значение для сервера.

Короткий ответ: ваше консольное приложение не является веб-браузером, и веб-сервер example.com ожидает взаимодействия с браузером.

Вы можете также рассмотреть возможность изменения ContentType на «multipart / form-data».

Что я нахожу странным, так это то, что вы по сути ничего не публикуете. Работа выполняется строкой запроса. Следовательно, вам, вероятно, следует использовать GET вместо POST.

...