【问题标题】:POST Requests on WP7WP7 上的 POST 请求
【发布时间】:2011-11-08 15:00:15
【问题描述】:

我已经死了大约 6 个小时,试图弄清楚如何在 WP7 中发出常规 POST 请求,我尝试了此处和许多其他地方发布的类似问题的答案,我还尝试了许多不同的 API POST 请求,它们都导致了一个特定的问题,

远程服务器返回错误:NotFound。

好像每次都少了点什么。

所以,如果你请有人告诉我们如何在这个 WP7 中正确地获得一个 POST 请求

【问题讨论】:

  • 为什么不向我们展示您尝试过的代码?
  • 如果服务器返回 404,可能是您输入了错误的 URL?您应该使用 Wireshark 查看网络级别的实际情况。
  • @RowlandShaw,我尝试了这么多代码,这么多..我不想干扰某人的想法,让它来调整我的代码,然后它就不能再工作了......我只是希望有人给我们一个模板,以便在 WP7 中发出正确的 POST 请求
  • 是HTTPS连接吗?如果是这样,有一个类似的问题:stackoverflow.com/questions/8049368/…

标签: silverlight windows-phone-7 httpwebrequest windows-phone-7.1


【解决方案1】:

我用它发帖到facebook没有任何问题:

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(requestUrl);
request.Method = "POST";
request.BeginGetResponse((e) =>
{
    try
    {
        WebResponse response = request.EndGetResponse(e);
        // Do Stuff
    }
    catch (WebException ex)
    {
        // Handle
    }
    catch (Exception ex)
    {
        // Handle
    }
}, null);

我假设您已经尝试过这个,所以它可能与发布数据有关(在上面的示例中没有,因为 facebook 使用查询字符串)。能否提供更多信息?

编辑:这是一个(未经测试的)编写帖子数据的示例:

HttpWebRequest request = (HttpWebRequest)HttpWebRequest.Create(requestUrl);
request.Method = "POST";
request.BeginGetRequestStream((e) =>
{
    using (Stream stream = request.EndGetRequestStream(e))
    {
        // Write data to the request stream
    }
    request.BeginGetResponse((callback) =>
    {
        try
        {
            WebResponse response = request.EndGetResponse(callback);
            // Do Stuff
        }
        catch (WebException ex)
        {
            // Handle
        }
        catch (Exception ex)
        {
            // Handle
        }
    }, null);
}, null);

【讨论】:

  • 我想我已经接近了,如何添加帖子数据?
  • 您需要调用 BeginGetRequestStream() 并将数据写入流(msdn.microsoft.com/en-us/library/…)。我会用一个例子来更新我的答案。
  • 像魅力一样工作 :) ,使用超过 API 进行测试,它甚至可以使用 https...谢谢。
【解决方案2】:

我使用以下类通过 WP7 发出 POST 请求:

public class PostMultiPartFormData
{
    private Dictionary<string, object> Parameters;
    private Encoding ENCODING = Encoding.UTF8;
    private string BOUNDARY = "-----------------------------wp7postrequest";
    public event EventHandler PostComplete;

    public void Post(string postbackURL,
        Dictionary<string, object> parameters)
    {
        Parameters = parameters;

        Uri url = null;
        url = new Uri(postbackURL);


        HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
        request.Method = "POST";

        request.ContentType = "multipart/form-data; boundary=" + BOUNDARY;
        request.BeginGetRequestStream(new AsyncCallback(SendStatusUpdate), request);
    }

    private void SendStatusUpdate(IAsyncResult ar)
    {
        HttpWebRequest request = (HttpWebRequest)ar.AsyncState;
        Stream stream = request.EndGetRequestStream(ar);

        byte[] byteArray = GetMultipartFormData(Parameters, BOUNDARY);

        stream.Write(byteArray, 0, byteArray.Length);
        stream.Close();
        stream.Dispose();

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

    private byte[] GetMultipartFormData(Dictionary<string, object> postParameters, string boundary)
    {
        Stream formDataStream = new System.IO.MemoryStream();
        foreach (var param in postParameters)
        {
            if (param.Value is byte[])
            {
                byte[] fileData = param.Value as byte[];

                string header = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"; filename=\"{2}.jpg\";\r\nContent-Type: application/octet-stream\r\n\r\n", boundary, param.Key, param.Key);

                formDataStream.Write(ENCODING.GetBytes(header), 0, header.Length);

                formDataStream.Write(fileData, 0, fileData.Length);
            }
            else
            {
                string postData = string.Format("--{0}\r\nContent-Disposition: form-data; name=\"{1}\"\r\n\r\n{2}\r\n", boundary, param.Key, param.Value);
                byte[] b = ENCODING.GetBytes(postData);
                foreach (var item in b)
                {
                    formDataStream.WriteByte(item);
                }
            }
        }

        string footer = "\r\n--" + boundary + "--\r\n";
        byte[] footerbytes = ENCODING.GetBytes(footer);
        formDataStream.Write(footerbytes, 0, footerbytes.Length);

        formDataStream.Position = 0;
        byte[] formData = new byte[formDataStream.Length];
        formDataStream.Read(formData, 0, formData.Length);
        formDataStream.Flush();
        formDataStream.Close();
        return formData;
    }

    private void StatusUpdateCompleted(IAsyncResult ar)
    {
        if (PostComplete != null)
        {
            PostComplete(ar, null);
        }
    }
}

例子:

PostMultiPartFormData postRequest = new PostMultiPartFormData();

        postRequest.PostComplete += new EventHandler( (sender, e) => 
        {
            IAsyncResult ar = ((IAsyncResult)sender);

            using (WebResponse resp = ((HttpWebRequest)ar.AsyncState).EndGetResponse(ar))
            {

                using (StreamReader sr = new StreamReader(resp.GetResponseStream()))
                {

                    string responseString = sr.ReadToEnd();

                    this.Dispatcher.BeginInvoke(() =>
                    {
                        textBlock.Text = responseString;
                    });
                }
            }
        });

        postRequest.Post("http://localhost:50624/SSLProxy.ashx", 
            new Dictionary<string, object>() { { "param1", "value1" } });

这应该可以... 如果不让我知道! :-)

【讨论】:

  • 我已经更新了我的帖子:添加了如何在 PostComplete 获取响应(作为字符串)的示例。
【解决方案3】:

要更轻松地访问高级 http 功能,请查看这些 http 类:

http://mytoolkit.codeplex.com/wikipage?title=Http

它封装了 GET、POST、FILES(使用路径或Stream 对象)和 GZIP(WP7 不直接支持)请求。

【讨论】:

    【解决方案4】:

    要添加帖子数据,只需调用 BeginGetRequestStream 方法(另外,BeginGetResponse 移动到 GetRequestStreamCallback)

    request.BeginGetRequestStream(new AsyncCallback(GetRequestStreamCallback), request);
    
    void GetRequestStreamCallback(IAsyncResult asynchronousResult)
    {
        HttpWebRequest webRequest = (HttpWebRequest)asynchronousResult.AsyncState;
        // End the stream request operation
        Stream postStream = webRequest.EndGetRequestStream(asynchronousResult);
    
        // Create the post data
        string postData = "post data";
        byte[] byteArray = Encoding.Unicode.GetBytes(postData);
    
        // Add the post data to the web request            
        postStream.Write(byteArray, 0, byteArray.Length);
        postStream.Close();
    
        // Start the web request
        webRequest.BeginGetResponse(new AsyncCallback(GetResponseCallback), webRequest);
    }
    

    【讨论】:

      【解决方案5】:

      我建议您使用postclient。这很简单。您只需要在项目中添加对 dll 文件的引用,然后编写如下内容:

      public void authorize(string login, string password)
      {
          Dictionary<string, object> parameters = new Dictionary<string, object>();
          parameters.Add("command", "login");
          parameters.Add("username", login);
          parameters.Add("password", password);
      
          PostClient proxy = new PostClient(parameters);
          proxy.DownloadStringCompleted += (sender, e) =>
          {
              if (e.Error == null)
              {
                  MessageBox.Show(e.Result);
              }
          };
          proxy.DownloadStringAsync(new Uri("http://address.com/service", UriKind.Absolute));
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2017-12-08
        • 1970-01-01
        • 2017-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-08-09
        相关资源
        最近更新 更多