2013-01-31 55 views
0

我在我的wp 7.1应用程序中有一个HttpWebRequest的小问题。应用程序通过POST方法将一些游戏统计数据发送到php服务器,但服务器不会获取它。 $ _POST数组保持为空。借助WireShark,我可以看到数据在发送到服务器的数据包中,但服务器不会收到任何数据。HttpWebRequest,post方法

下面是该数据发送方法的代码:

private void SendStatisticsToServer() 
    { 
     if (this.stat.Name == String.Empty || Object.ReferenceEquals(this.stat.Name, null)) 
     { 
      this.OnEmptyNameEvent(); 
     } 
     else 
     { 
      HttpWebRequest request = WebRequest.Create(ADDRESS) as HttpWebRequest; 
      request.Method = "POST"; 
      request.ContentType = "text/plain"; 
      request.AllowReadStreamBuffering = false; 

      request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallBack), request); 
     } 
    } 

    private void GetRequestStreamCallBack(IAsyncResult requestRes) 
    { 
     StringBuilder builder = new StringBuilder("user="); 
     builder.Append(this.stat.Name); 
     builder.Append("&won="); 
     builder.Append(this.stat.Won == true ? "1" : "0"); 
     builder.Append("&scores="); 
     builder.Append(this.stat.Scores.ToString()); 

     Byte[] byteArray = Encoding.UTF8.GetBytes(builder.ToString()); 

     HttpWebRequest request = requestRes.AsyncState as HttpWebRequest; 
     Stream stream = request.EndGetRequestStream(requestRes); 
     stream.Write(byteArray, 0, byteArray.Length); 
     stream.Flush(); 
     stream.Close(); 

     request.BeginGetResponse(new AsyncCallback(GetResponseCallback), request); 
    } 

    private void GetResponseCallback(IAsyncResult requestRes) 
    { 
     HttpWebRequest request = requestRes.AsyncState as HttpWebRequest; 

     HttpWebResponse response = request.EndGetResponse(requestRes) as HttpWebResponse; 
     Stream stream = response.GetResponseStream(); 
     StreamReader streamRead = new StreamReader(stream); 
     String responseString = streamRead.ReadToEnd(); 
     stream.Close(); 
     streamRead.Close(); 

     response.Close(); 
     this.OnExitButtonPressedEvent(ButtonType.Exit); 
    } 

(我是没有意见的代码抱歉,但我认为这是不言自明)

由于你可以看到,它几乎是从MSDN复制过来的。

这里是-server代码的PHP:

<?php 
    header('Content-type: text/plain'); 
    // HTTP/1.1 
    header("Cache-Control: no-store, no-cache, must-revalidate"); 
    // HTTP/1.0 
    header("Pragma: no-cache"); 
    $logfile = 'postdata.txt'; 
    $firstData = $_POST["user"]; 
    $secondData = $_POST["won"]; 
    $thirdData = $_POST["scores"]; 
    $file = fopen($logfile, "a+"); 

    fwrite($file, "Post received - data: firstData=". $firstData . " 
    secondData=" . $secondData . " thirdData=" . $thirdData . "\r\n"); 
    fclose($file); 

    ?> 

正如你所看到的,这个服务器并没有做太多 - 只接收数据,将其推入日志-file。

这绝对不是服务器的bug,因为使用Qt编写的旧应用程序在相同的条件下工作正常并且$ _POST数组不是空的。

请问,请告诉我,哪里可能出现错误?

目标平台是WP 7.1。

预先感谢您的答案。

+1

你说你用wireshark看了一下,服务器的回应是什么? – Pete

+0

@Pete是的,我用wireshark检查数据包的内容。根据wireshark,服务器响应是HTTP/1.1 200 OK。我也在应用程序中获得了相同的响应(response.StatusCode总是返回OK) – user1415536

+0

您能发布wireshark看到的URL和标头吗? – Pete

回答

2

我将不得不做这个答案,但我不完全确定这是正确的。我相信,一个text/plain的帖子,该参数的格式是:

user=d 
won=1 
scores=3 

如果你的应用程序/ X WWW的形式,进行了urlencoded,那么你会用

user=d&won=1&scores=3 

有去也可能PHP不支持text/plain。

+0

这有点奇怪,我尝试将唯一的参数发送到服务器,结果仍然是相同的。 $ _POST数组是空的。 – user1415536

+0

我不得不说你谢谢,伙计。根据你的回答,我做出了应用程序中唯一的变化,现在它正在工作! request.ContentType =“application/x-www-form-urlencoded”; 在服务器端也做了一些小修改: header('Content-type:application/x-www-form-urlencoded'); – user1415536