1

申し訳ありませんが、質問はすでにstackoverflowにありましたが、答えが見つかりません。古典的かもしれませんが、この問題を解決する方法がわかりません:( Webサービスを操作するためのシングルトーンクラスがあります:

public sealed class GYAccessService
    {
        static GYAccessService instance = null;
        static readonly object padlock = new object();
        public string Atoken { get; set; }
        public string Login { get; set; }
        public string Password { get; set; }
        public string Uid { get; set; }
        const string UrlRequest = "http://site.html";

    private GYAccessService()
    {

    }

    public static GYAccessService Instance
    {
        get
        {
            lock (padlock)
            {
                if (instance == null)
                {
                    instance = new GYAccessService();
                }
                return instance;
            }
        }
    }


    public void sendPost(string postData)
    {
        PostData = "request=" + postData;
        HttpWebRequest webRequest = (HttpWebRequest)WebRequest.Create(UrlRequest);
        webRequest.Method = "POST";
        webRequest.ContentType = "application/x-www-form-urlencoded";
        webRequest.Accept = "application/json";
        webRequest.AllowAutoRedirect = true;
        // Start the request
        webRequest.BeginGetRequestStream(new AsyncCallback(getRequestStreamCallback), webRequest);

    }

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

        byte[] byteArray = Encoding.UTF8.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);
    }

    private void getResponseCallback(IAsyncResult asynchronousResult)
    {
        try
        {
            HttpWebRequest webRequest = (HttpWebRequest)asynchronousResult.AsyncState;
            HttpWebResponse response;

            // End the get response operation
            response = (HttpWebResponse)webRequest.EndGetResponse(asynchronousResult);
            Stream streamResponse = response.GetResponseStream();
            StreamReader streamReader = new StreamReader(streamResponse);
            var Response = streamReader.ReadToEnd();
            streamResponse.Close();
            streamReader.Close();
            response.Close();
            using (MemoryStream stream = new MemoryStream(Encoding.Unicode.GetBytes(Response)))
            {
                DataContractJsonSerializer serializer = new DataContractJsonSerializer(typeof(ServiceResponse));
                ServiceResponse res = (ServiceResponse)serializer.ReadObject(stream);
                // I want to return res  in main thread
            }

        }
        catch (WebException e)
        {
            // Error treatment                
           ServiceResponse err = new ServiceResponse();
           err.Message = e.Message;
        }
    }

    public string getRequestString(string model, string method, Params parametrs, string auth = null)
    {
        Function func = new Function();
        func.Model = model;
        func.Method = method;
        func.Params = parametrs;
        ServiceRequest req = new ServiceRequest() { Function = func };
        string json = JsonConvert.SerializeObject(req);
        ServiceResponse deserializedProduct = JsonConvert.DeserializeObject<ServiceResponse>(json);
        return json;
    }
}

メインスレッドでsendPost()を呼び出しましたが、この関数で応答を返したいです。

 GYAccessService gy = GYAccessService.Instance;
 gy.sendPost(postData); 
 //I want to use the response here

ただし、WP 7では、HttpWebRequestにはGetResponseがなく、BeginGetResponseのみがあります。コールバックを使用していますが、コールバックから応答を返す方法がわかりません。私はそれを我慢し、プロパティ応答をシングルトーンに設定して、非同期コールバックの終了後に取得できますが、非同期コールバックをブロックする方法がわかりません。それは本当に問題です、私はWaitOne()/ Set()を使おうとします-私を助けないでください、私のアプリはちょうどフリーズしました。IAsyncResultハンドルを使用しようとしましたが、成功しませんでした。非同期コールバックが機能するのを待つにはどうすればよいですか?前もって感謝します!

4

1 に答える 1

1

EndGetResponseメソッドを使用して、その中で結果を処理する必要があります。非同期であるため、呼び出した直後に結果を取得することはできませんgy.sendPost(postData);。コールバックとして使用する必要があります。

私が提案するかもしれないが、そのようなHTTP呼び出しのためのより簡単な方法があります、RestSharpを使用してください。これは、WindowsPhoneでも機能する優れた使いやすいライブラリです。

于 2012-12-29T12:37:05.207 に答える