Вызов метода POST в WP7 - PullRequest
       4

Вызов метода POST в WP7

3 голосов
/ 16 ноября 2011

Я новичок в разработке приложений для Windows Phone 7. Я пытаюсь вызвать URL в моей программе, используя метод POST, который принимает некоторые параметры. После успешного поста я должен получить ответ в формате JSON. Но я не получаю ответ. Код, который я использую:

    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());
            }
        }
    }

Я не могу найти реальную проблему. Кто-нибудь может мне помочь?

Ответы [ 4 ]

0 голосов
/ 18 ноября 2011

Я получил решение как:

   {
        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 голосов
/ 16 ноября 2011

Этот пример взят из 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 голосов
/ 17 ноября 2011

WP7 поставляется с «Reactive Extensions», который полезен для асинхронных взаимодействий в целом.В этом примере http://wp7guide.codeplex.com показано, как использовать его для сообщений HTTP (и других вещей)

Предостережение: образец для довольно продвинутого приложения и предназначен для демонстрации многих других вещей, таких как модульное тестированиеиспользование шаблона MVVM и т. д. Он может быть более сложным, чем вам нужно.

0 голосов
/ 16 ноября 2011

Возможно, это не настоящий ответ, но я всегда использую: http://postclient.codeplex.com/ при работе с сообщениями.Это просто чтобы убедиться, что я не пишу никаких ошибок с кодом запроса.Просто попробуйте.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...