2011-11-16 71 views
3

我是Windows Phone 7应用程序开发的新手。我正在尝试使用POST方法在我的程序中调用一个URL,该方法需要一些参数。成功发布后,我应该以JSON格式获得响应。但我没有得到答复。我使用的代码是:在WP7中调用POST方法

public void Submit() 
    { 
     // Prepare web request... 
     HttpWebRequest myRequest = (HttpWebRequest)WebRequest.Create(new Uri(someUrl, UriKind.Absolute)); 
     myRequest.Method = "POST"; 
     myRequest.ContentType = string.Format("multipart/form-data; boundary={0}", boundary); 

     myRequest.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), myRequest); 
    } 


    public string url { get; set; } 
    private Dictionary<string, string> _parameters = new Dictionary<string, string>(); 

    public Dictionary<string, string> parameters 
    { 
     get { return _parameters; } 
     set { _parameters = value; } 
    } 

    string boundary = "----------" + DateTime.Now.Ticks.ToString(); 


    private void GetRequestStreamCallback(IAsyncResult asynchronousResult) 
    { 
     HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState; 
     Stream postStream = request.EndGetRequestStream(asynchronousResult); 
     parameters.Add("userid", "0"); 
     parameters.Add("locationid", "0"); 
     writeMultipartObject(postStream, parameters); 
     postStream.Close(); 

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

    private void GetResponseCallback(IAsyncResult asynchronousResult) 
    { 
     HttpWebRequest request = (HttpWebRequest)asynchronousResult.AsyncState; 
     HttpWebResponse response = (HttpWebResponse)request.EndGetResponse(asynchronousResult); 
     Stream streamResponse = response.GetResponseStream(); 
     StreamReader streamRead = new StreamReader(streamResponse); 
     streamResponse.Close(); 
     streamRead.Close(); 
     // Release the HttpWebResponse 
     response.Close(); 
    } 

    public void writeMultipartObject(Stream stream, object data) 
    { 
     StreamWriter writer = new StreamWriter(stream); 
     if (data != null) 
     { 
      foreach (var entry in data as Dictionary<string, string>) 
      { 
       WriteEntry(writer, entry.Key, entry.Value); 
      } 
     } 
     writer.Write("--"); 
     writer.Write(boundary); 
     writer.WriteLine("--"); 
     writer.Flush(); 
    } 

    private void WriteEntry(StreamWriter writer, string key, object value) 
    { 
     if (value != null) 
     { 
      writer.Write("--"); 
      writer.WriteLine(boundary); 
      if (value is byte[]) 
      { 
       byte[] ba = value as byte[]; 

       writer.WriteLine(@"Content-Disposition: form-data; name=""{0}""; filename=""{1}""", key, "sentPhoto.jpg"); 
       writer.WriteLine(@"Content-Type: application/octet-stream"); 
       //writer.WriteLine(@"Content-Type: image/jpeg"); 
       writer.WriteLine(@"Content-Length: " + ba.Length); 
       writer.WriteLine(); 
       writer.Flush(); 
       Stream output = writer.BaseStream; 

       output.Write(ba, 0, ba.Length); 
       output.Flush(); 
       writer.WriteLine(); 
      } 
      else 
      { 
       writer.WriteLine(@"Content-Disposition: form-data; name=""{0}""", key); 
       writer.WriteLine(); 
       writer.WriteLine(value.ToString()); 
      } 
     } 
    } 

我找不到真正的问题。有人帮我解决问题吗?

+0

嗨获得,你能否确认Web服务器响应您的张贴?在你的代码中,似乎你正在正确地执行你的请求,但你似乎没有在请求的主体中添加任何数据。这是一个POST应该做的事情。服务器可能不接受您的请求。 – ajmccall

回答

0

我得到了解决办法为:

{ 
     Dictionary<string, object> param = new Dictionary<string, object>(); 
     param.Add(DataHolder.USER_ID, "0"); 
     param.Add(DataHolder.DEFAULT_LOCATION_ID, "0"); 
     PostClient proxy = new PostClient(param); 
     proxy.DownloadStringCompleted += new PostClient.DownloadStringCompletedHandler(proxy_DownloadStringCompleted);   
     proxy.DownloadStringAsync(new Uri(DataHolder.mainConfigFetchUrl, UriKind.Absolute)); 





    } 

    void proxy_DownloadStringCompleted(object sender, DownloadStringCompletedEventArgs e) 
    { 
     if (e.Error == null) 
     { 
      //Process the result... 
      string data = e.Result; 
     } 
    } 

对于PostClient我们需要一个WindowsPhonePostClient.dll可以从http://postclient.codeplex.com/

0

这个例子来自http://northernlights.codeplex.com

/// <summary> 
    /// Send error report (exception) to HTTP endpoint. 
    /// </summary> 
    /// <param name="uri">The Endpoint to report to.</param> 
    /// <param name="exception">Exception to send.</param> 
    public void SendExceptionToHttpEndpoint(string uri, ExceptionContainer exception) 
    { 
     if (!this.AllowAnonymousHttpReporting) 
     { 
      return; 
     } 

     try 
     { 
      HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(uri); 
      webRequest.Method = "POST"; 
      webRequest.ContentType = "application/x-www-form-urlencoded"; 

      webRequest.BeginGetRequestStream(
       r => 
       { 
        try 
        { 
         HttpWebRequest request1 = (HttpWebRequest)r.AsyncState; 
         Stream postStream = request1.EndGetRequestStream(r); 

         string info = string.Format("{0}{1}{2}{1}AppVersion: {3}{1}", exception.Message, Environment.NewLine, exception.StackTrace, exception.AppVersion); 

         string postData = "&exception=" + HttpUtility.UrlEncode(info); 
         byte[] byteArray = Encoding.UTF8.GetBytes(postData); 

         postStream.Write(byteArray, 0, byteArray.Length); 
         postStream.Close(); 

         request1.BeginGetResponse(
          s => 
          { 
           try 
           { 
            HttpWebRequest request2 = (HttpWebRequest)s.AsyncState; 
            HttpWebResponse response = (HttpWebResponse)request2.EndGetResponse(s); 

            Stream streamResponse = response.GetResponseStream(); 
            StreamReader streamReader = new StreamReader(streamResponse); 
            string response2 = streamReader.ReadToEnd(); 
            streamResponse.Close(); 
            streamReader.Close(); 
            response.Close(); 
           } 
           catch 
           { 
           } 
          }, 
         request1); 
        } 
        catch 
        { 
        } 
       }, 
      webRequest); 
     } 
     catch 
     { 
     } 
    } 

它表明你如何发布。

+0

你为什么捕捉并丢弃异常?忽略这些例外是否安全? –

+0

在这种情况下,POST成功并不重要。此代码用于向Windows Phone应用程序的开发者报告以前的异常。你可以在这里添加你自己的异常处理。 – invalidusername

0

WP7附带了“反应性扩展”,这对一般的异步交互很有帮助。此示例http://wp7guide.codeplex.com显示了如何将它用于HTTP Posts(以及其他内容)

注意:该示例适用于相当先进的应用程序,并且旨在显示许多其他内容,例如使用MVVM模式的单元测试等。它可能比你需要的更复杂。