繁体   English   中英

如何等待HttpWebRequest的Web请求完成?

[英]how to wait until a web request with HttpWebRequest is finished?

我正在做一个Web请求登录我的Web服务,我遇到了问题。 我需要等到登录完成后再结束启动登录的方法,因为我需要返回一个布尔值,表示登录是否正确。 在下面的代码中,我将注释放在需要等待“httpWebRequest.BeginGetResponse(...)”结果的位置

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我找不到解决方案。 感谢大家!!!

只需使用更新的异步风格:

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

您现在不需要太多调用BeginXXX - 当然,Microsoft 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>其中,当异步操作完成才会完成。 所以你应该等待调用代码中的结果。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM