1

對不起,它的問題已經在stackoverflow,但我沒有找到答案。也許這是經典的,但我不明白,怎麼解決這個問題:( 我Singletone類與Web服務工作:如何才能結束工作異步回調Windows Phone 7上的HttpWebRequest?

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。我用的回調,不知道我怎麼能返回從回調的反應。我忍了吧,我可以設置屬性響應我的Singletone並在異步回調結束後得到它,但我不知道如何阻止異步回調。這真的是問題,我嘗試使用WaitOn e()/ Set() - 不幫我,我的應用程序剛剛凍結。我嘗試使用IAsyncResult句柄,但不成功。我怎樣才能結束工作異步回調?提前致謝!

回答

1

您需要使用EndGetResponse方法並處理結果。它是異步的,因此在您致電gy.sendPost(postData);後,您將無法立即獲得結果,您必須將其用作回撥。

如果我可以建議,這種HTTP調用有一個更簡單的方法,使用RestSharp。這是一個非常好用的庫,也可以與Windows Phone一起使用。

+0

感謝幫助!我現在不嘗試這個代碼,但我檢查了鏈接RestSharp。在示例同步和異步請求中,它將在Windows Phone 7上運行?我的意思是同步請求? – Alexandr

+0

@Alexandr不,你不能在windows phone中同步請求,你必須總是使用異步 –

相關問題