1

这样做时偶然发现了一个问题,我首先搜索了 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尚未设置变量。我错过了我的代码中的明显内容吗?

屏幕

感谢回复的人。

4

3 回答 3

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();
}
于 2012-09-27T16:20:23.450 回答
2

您没有关闭请求流。请参阅MSDN 文档中的此示例,该示例与您的代码非常接近。

编辑

您的 PHP 空值检查也不正确。 见这篇文章

于 2012-09-27T16:27:23.017 回答
0

我发现了问题。

事实证明,我/在请求中省略了尾随,并且请求得到了 301,无论出于何种原因,它都删除了 post 变量。

http://82.41.255.140/api/post-ptr本来应该如此http://82.41.255.140/api/post-ptr/

感谢所有回答的人,我已经 +1 了。

于 2012-09-28T14:23:25.360 回答