2014-07-09 52 views
2

我正在做一個Web請求登錄我的Web服務,我有一個問題。我需要等到登錄完成之後才結束啓動登錄的方法,因爲我需要返回表示登錄是否正確的布爾值。在下面的代碼,我把一個評論,我需要等待結果「httpWebRequest.BeginGetResponse(......)」如何等待,直到與HttpWebRequest的Web請求完成?

public async Task<bool> login(string user, string passwrd) 
{ 
    mLoginData.setUserName(user); 
    mLoginData.setPasswd(passwrd); 

    string serviceURL = mBaseURL + "/pwpcloud/service/user/login"; 

    //build the REST request 
    // HTTP web request 
    var httpWebRequest = (HttpWebRequest)WebRequest.Create(serviceURL); 
    httpWebRequest.ContentType = "application/json"; 
    httpWebRequest.Method = "POST"; 

    // Write the request Asynchronously 
    using (var stream = await Task.Factory.FromAsync<Stream>(httpWebRequest.BeginGetRequestStream, httpWebRequest.EndGetRequestStream, null)) 
    { 

     string parameters = "{\"username\":\"" + user + "\",\"password\":\"" + passwrd + "\"}"; 
     byte[] byteArray = Encoding.UTF8.GetBytes(parameters); 

     // Write the bytes to the stream 
     await stream.WriteAsync(byteArray, 0, byteArray.Length); 
    } 
    //httpWebRequest.BeginGetResponse(new AsyncCallback(OnGettingLoginResponse), httpWebRequest); 
    httpWebRequest.BeginGetResponse(r => 
     { 
      using (HttpWebResponse response = (HttpWebResponse)httpWebRequest.EndGetResponse(r)) 
      { 
       string data; 

       // Read the response into a Stream object. 
       Stream responseStream = response.GetResponseStream(); 
       using (var reader = new StreamReader(responseStream)) 
       { 
        data = reader.ReadToEnd(); 
       } 
       responseStream.Close(); 
       if (response.StatusCode == HttpStatusCode.OK) 
       { 
        dynamic jsonData = JObject.Parse(data); 
        string token = jsonData.token; 
        mLoginData.setToken(token); 
        string userId = jsonData.userId; 
        mLoginData.setUserID(userId); 
        mLoginData.setLogged(true); 
        //guardamos los valores en el isolatedStorageSettings para que persistan. 
        App.settings.Clear(); 
        App.settings.Add("userId", mLoginData.getUserID()); 
        App.settings.Add("token", mLoginData.getToken()); 
        App.settings.Add("userName", mLoginData.getUserName()); 
        App.settings.Add("passwd", mLoginData.getPasswd()); 
        App.settings.Add("logged", mLoginData.isLogged()); 
        App.settings.Save(); 
       } 
       else 
       { 
        if (CultureInfo.CurrentUICulture.Name.ToString().Contains("ES")) 
        { 
         if (response.StatusCode == HttpStatusCode.Unauthorized || response.StatusCode == HttpStatusCode.BadRequest) 
         { 
          MessageBox.Show("Usuario o contraseña incorrectos"); 
         } 
         else 
         { 
          MessageBox.Show("Error de conexión."); 
         } 
        } 
        else 
        { 
         if (response.StatusCode == HttpStatusCode.Unauthorized || response.StatusCode == HttpStatusCode.BadRequest) 
         { 
          MessageBox.Show("User or password were incorrect"); 
         } 
         else 
         { 
          MessageBox.Show("NNetwork connection error"); 
         } 
        } 
       } 
      } 
     }, null); 
    //here i need wait for the result of the webrequest to return true if the login was successfull. 
    return mLoginData.isLogged(); 
} 

我讀了很多關於這個BUF我沒有找到解決方案。 謝謝大家!

回答

4

只需使用異步的新風格:

using (var response = (HttpWebResponse) await request.GetResponseAsync()) 
{ 
    ... 
} 

你不應該需要調用BeginXXX現在很多 - 對於基於任務的異步模式肯定是微軟的API已經非常普遍增加了支持。

如果GetResponseAsync不可用,用Task.Factory.FromAsync就像你有BeginRequestStream

var responseTask = Task.Factory.FromAsync<WebResponse> 
             (httpWebRequest.BeginGetResponse, 
             httpWebRequest.EndGetResponse, 
             null); 
using (var response = (HttpWebResponse) await responseTask) 
{ 
} 

注意,因爲你正在寫一個async方法,最初的方法調用仍然快速完成 - 但它將返回一個Task<bool>,這將只在異步操作完成時完成。所以你應該也可以在調用代碼中等待結果。

+0

謝謝,但問題是,在Windows Phone 8中不存在GetResponseAsync()方法。只能使用「BeginGetResponse(...)」 –

+0

@LuisLópez:所以像'GetRequest'一樣使用'Task.Factory.FromAsync'。將編輯我的答案。 –

+0

這是有效的!非常感謝! –