Сохранение данных в Windows Phone, полученных от WCF/веб-сервиса.

Сохранение данных в Windows Phone, полученных от WCF/веб-сервиса. Ответ может быть получен через некоторое время, поэтому, как справиться с этой ситуацией. Сохранение данных не проблема, но что делать, если данные получены с опозданием


person user1881251    schedule 21.01.2013    source источник


Ответы (2)


Вы можете использовать этот код (покажите код из моего проекта):

public void sendPost(string postData, Action<MyResponse, Exception> callback, CreateResponse creater)
        {
            HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(UrlRequest);
            webRequest.Method = "POST";
            webRequest.ContentType = "application/x-www-form-urlencoded";
            webRequest.Accept = "application/json";
            webRequest.AllowAutoRedirect = true;
            webRequest.BeginGetRequestStream(new AsyncCallback(getRequestStreamCallback), new Request()
            {
                HttpRequest = webRequest,
                PostData = postData,
                Url = UrlRequest,
                CallBack = callback,
                Creater = creater
            });
        }

 private void getRequestStreamCallback(IAsyncResult asynchronousResult)
        {
            var request = (Request)asynchronousResult.AsyncState;
            // End the stream request operation
            Stream postStream = request.HttpRequest.EndGetRequestStream(asynchronousResult);

            byte[] byteArray = Encoding.UTF8.GetBytes(request.PostData);

            // Add the post data to the web request
            postStream.Write(byteArray, 0, byteArray.Length);
            postStream.Close();

            // Start the web request
            request.HttpRequest.BeginGetResponse(new AsyncCallback(getResponseCallback), request);
        }

private void getResponseCallback(IAsyncResult asynchronousResult)
        {
            var request = (Request)asynchronousResult.AsyncState;
            try
            {

                HttpWebResponse response;

                // End the get response operation
                response = (HttpWebResponse)request.HttpRequest.EndGetResponse(asynchronousResult);
                Stream streamResponse = response.GetResponseStream();
                StreamReader streamReader = new StreamReader(streamResponse);
                var myResponse = streamReader.ReadToEnd();
                streamResponse.Close();
                streamReader.Close();
                response.Close();
                MyResponse response_obj = request.Creater.CreateResponseObj();
                using (MemoryStream stream = new MemoryStream(Encoding.Unicode.GetBytes(myResponse)))
                {
                    DataContractJsonSerializer serializer = new DataContractJsonSerializer(response_obj.GetType());
                    response_obj = (GYResponse)serializer.ReadObject(stream);
                    if (request.CallBack != null)
                    {
                        request.CallBack.Invoke(response_obj, null);
                    }
                }
            }
            catch (WebException e)
            {

                if (request.CallBack != null)
                {
                    request.CallBack.Invoke(null, e);
                }
            }
        }
public void getInfo(string uid, Action<MyResponse, Exception> callback)
        {
            CreateResponse creater = new CreateResponseGetInfo();
            string model = "User";
            string method = "getInfo";
            Params parametrs = new Params();
            parametrs.Uid = uid;
            //create yor request
            string request = getRequestString(model, method, parametrs, Atoken);                 
            sendPost(request, callback, creater);
        }

Итак, вы вызываете метод, который отправляет запрос веб-сервису postRequester.getInfo(uid, ResponseHandler) и использует делегат для обработки результата.

private void ResponseHandler(MyResponse result, Exception error)
        {
            if (error != null)
            {
                string err = error.Message;
                return;
            }
            else
            {
                var infoResponse = result as ResponseGetInfo;
                if (infoResponse != null)
                {
                      //result processing..              
                }

            }
        }
person Alexandr    schedule 21.01.2013

Все веб-запросы, которые вы делаете в приложении Windows Phone, являются асинхронными. Это означает, что вы делаете веб-запрос из своего приложения и прикрепляете обработчик для обработки ответа, когда он приходит. В обработчике ответа вам придется позаботиться об ответе и делать с ним все, что вы хотите.

Проверьте эту ссылку Использование WebClient и HttpWebRequest

person nkchandra    schedule 21.01.2013