Получить данные POST, отправленные из приложения С# в PHP

Наткнувшись на проблему при этом, я сначала искал SO, чтобы попытаться выяснить, были ли у других подобные проблемы, и нашел этот вопрос: POST-данные на PHP-страницу из C# WinForm

Однако, когда я попробовал пример кода, приведенный в ответе на этот вопрос, он не работает. PHP-скрипт, который я запрашиваю, отвечает сообщением, указывающим, что переменная POST, которая должна быть установлена, не установлена. Вот мой код С#:

HttpWebRequest POSTreq =
    (HttpWebRequest)WebRequest.Create("http://82.41.255.140/api/post-ptr");

string POSTdata = "action=" + HttpUtility.UrlEncode("date");
byte[] data = Encoding.ASCII.GetBytes(POSTdata);

POSTreq.Method = "POST";
POSTreq.ContentType = "application/x-www-form-urlencoded";
POSTreq.ContentLength = data.LongLength;

POSTreq.GetRequestStream().Write(data, 0, data.Length);

HttpWebResponse POSTres = (HttpWebResponse)POSTreq.GetResponse();
Console.WriteLine("HTTP Status Code {0}", POSTres.StatusCode);
Console.WriteLine("Response Method: {0}", POSTres.Method);
Console.WriteLine("Response Text: {0}",
    new StreamReader(POSTres.GetResponseStream()).ReadToEnd());
Console.ReadLine();

А это код внутри скрипта PHP:

<?php    
    $A = strtolower($_POST["action"]);

    if ($A == "date")
    {
        echo date("c");
    }
    else if ($A == "ip")
    {
        echo $_SERVER["REMOTE_ADDR"];
    }
    else if ($A == null || $A == "")
    {
        echo "bad_request:no_argument:POST_action";
    }
    else
    {
        echo "bad_request:invalid_argument:POST_action";
    }

    exit();
?>

Когда я делаю запрос POST из своей программы на C#, я вижу следующий экран, показывающий, что переменная action не была установлена. Я упускаю очевидное в своем коде?

экран

Спасибо тем, кто ответит.


person LMS    schedule 27.09.2012    source источник
comment
Попробуйте поставить CR/LF после содержания сообщения.   -  person Joachim Isaksson    schedule 27.09.2012
comment
Изменение POSTdata на "action=" + HttpUtility.UrlEncode("date") + "\r\n" вызывает WebException. То же самое, если я попробую \r и \n по отдельности.   -  person LMS    schedule 27.09.2012
comment
Вы можете проверить, установлено ли действие, прежде чем разыменовывать его.   -  person Cole Johnson    schedule 27.09.2012
comment
Вы имеете в виду в PHP-скрипте? Если это так, action всегда выглядит как null при создании запроса из программы C#.   -  person LMS    schedule 27.09.2012


Ответы (3)


Возможно, вам придется очистить поток. Я обычно делаю так:

string POSTdata = "action=" + HttpUtility.UrlEncode("date");
byte[] data = Encoding.ASCII.GetBytes(POSTdata);

POSTreq.Method = "POST";
POSTreq.ContentType = "application/x-www-form-urlencoded";
POSTreq.ContentLength = data.LongLength;

using (Stream stream = POSTreq.GetRequestStream()) {
    stream.Write(data, 0, data.Length);
    stream.Flush();
}
person Lloyd    schedule 27.09.2012
comment
Это не решает его по какой-либо причине. Stream POSTstr = POSTreq.GetRequestStream(); POSTstr.Write(data, 0, data.Length); POSTstr.Flush(); POSTstr.Close(); по-прежнему выдает ответ без аргументов. - person LMS; 27.09.2012

Вы не закрываете поток запросов. См. этот пример в документации MSDN, который очень близок к вашему код.

ИЗМЕНИТЬ

Ваша нулевая проверка PHP также неверна. см. эту статью.

person Matt Johnson-Pint    schedule 27.09.2012
comment
@Lloyd - извините, мы печатали одновременно. Ваш ответ тоже правильный. - person Matt Johnson-Pint; 27.09.2012
comment
Это не должно быть связано с тем, почему данные не принимаются. - person Cole Johnson; 27.09.2012
comment
Добавление POSTstr.Close() (поток запросов) по-прежнему не решает проблему; Я все еще получаю ответ без аргументов. - person LMS; 27.09.2012
comment
Используйте fiddler (www.fiddler2.com), чтобы проверить, что на самом деле отправляется. Тогда вы будете знать, на чем сосредоточиться: на стороне .Net или на стороне PHP. - person Matt Johnson-Pint; 27.09.2012
comment
Извините за долгое время без ответа. Пришлось идти внезапно. Во всяком случае, я использовал Fiddler, и мне кажется, что он на стороне PHP. Я сравнил запрос к серверу Imgur с запросом к моему серверу, и запрос к моему серверу оказался в порядке. i.imgur.com/NjHhG.png - person LMS; 28.09.2012

Я нашел проблему.

Оказывается, я пропустил завершающий / в запросе, и запрос получил 301, что по какой-то причине удалило переменные сообщения.

Так что http://82.41.255.140/api/post-ptr должно было быть http://82.41.255.140/api/post-ptr/.

Спасибо всем, кто ответил, всем +1.

person LMS    schedule 28.09.2012