从PHP中检索从C#应用程序发送的POST数据

时间:2012-09-27 16:16:39

标签: c# php post httpwebrequest httpwebresponse

在这样做时偶然发现了一个问题,我首先搜索SO试图找出其他人是否遇到类似的问题,并发现了这个问题:POST data to a PHP page from C# WinForm

但是,当我尝试在这个问题的答案中给出的代码示例时,它不起作用。我正在请求响应的PHP脚本,并显示一条消息,指示必须设置的POST变量。这是我的C#代码:

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();
?>

当我从C#程序发出POST请求时,我看到以下屏幕,表明尚未设置变量action。我错过了我的代码中的明显内容吗?

screen

感谢那些回复的人。

3 个答案:

答案 0 :(得分:4)

您可能需要刷新流。我通常这样做:

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();
}

答案 1 :(得分:2)

您没有关闭请求流。请参阅this example in the MSDN docs,它与您的代码非常接近。

修改

您的PHP null检查也不正确。 See this article

答案 2 :(得分:0)

我发现了问题。

事实证明我离开了请求中的尾随/,并且请求获得了301'd,无论出于何种原因删除了帖子变量。

所以http://82.41.255.140/api/post-ptr应该是http://82.41.255.140/api/post-ptr/

感谢所有回答的人,我为你们所做的一切都给了你们。