0

WCF/Web サービスから受信した Windows Phone にデータを保存します。しばらくしてから応答が返ってくることがありますので、この場合の対処方法を教えてください。データの保存は問題ないが、データの受信が遅れた場合の対処法

4

2 に答える 2

0

Windows Phone アプリで行う Web 要求はすべて非同期です。つまり、アプリから Web リクエストを作成し、ハンドラーをアタッチして、レスポンスが来たときにそれを処理します。応答ハンドラーでは、応答を処理し、必要なことを行う必要があります。

このリンクを確認してくださいWebClient と HttpWebRequest の使用

于 2013-01-21T06:19:23.210 に答える
0

このコードを使用できます (私のプロジェクトのコードを表示してください):

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

したがって、メソッドを呼び出して、リクエストを Web サービスに送信し、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..              
                }

            }
        }
于 2013-01-21T05:18:36.250 に答える