2014-07-09 53 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

这是有效的!非常感谢! –