gpt4 book ai didi

c# - 如何等到使用 HttpWebRequest 的 Web 请求完成?

转载 作者:行者123 更新时间:2023-11-30 14:55:46 26 4
gpt4 key购买 nike

我正在执行一个 Web 请求以登录我的 Web 服务,但我遇到了问题。我需要等到登录完成才能结束启动登录的方法,因为我需要返回一个 bool 值来表示登录是否正确。在下面的代码中,我在需要等待“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>只有在异步操作完成时才会完成。因此,您可能也应该在调用代码中等待结果。

关于c# - 如何等到使用 HttpWebRequest 的 Web 请求完成?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24649573/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com