POST Requests on WP7

前端 未结 5 2113
傲寒
傲寒 2021-02-11 05:20

I\'ve been dying for about 6 hours trying to figure out how to make a regular POST request in WP7 , I tried the answers of similar questions posted here and on many other places

5条回答
  •  傲寒
    傲寒 (楼主)
    2021-02-11 05:47

    I use the following class for making POST requests with WP7:

    public class PostMultiPartFormData
    {
        private Dictionary Parameters;
        private Encoding ENCODING = Encoding.UTF8;
        private string BOUNDARY = "-----------------------------wp7postrequest";
        public event EventHandler PostComplete;
    
        public void Post(string postbackURL,
            Dictionary 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 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);
            }
        }
    }
    

    Example:

    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() { { "param1", "value1" } });
    

    This should work... If it doesn't let me know! :-)

提交回复
热议问题