用于调用REST服务的HTTPClient不工作
本文关键字:HTTPClient 工作 服务 调用 REST 用于 | 更新日期: 2023-09-27 18:03:20
我正在尝试使用REST服务,它以JSON格式返回我的数据。我用的是简单的逻辑。但是代码会卡在线上。我从模拟器和设备检查了这个代码。var response = await httpClient.SendAsync(request);
我的代码
public async Task<string> GetMyData(string urlToCall)
{
using (HttpClient httpClient = new HttpClient())
{
HttpRequestMessage request = new HttpRequestMessage(System.Net.Http.HttpMethod.Get, urlToCall);
var response = await httpClient.SendAsync(request);
var responseString = await response.Content.ReadAsStringAsync();
return responseString;
}
}
,调用就像,
string result = GetMyData(url).Result;
我错过了什么吗?我想同步获取数据,而不是WebClient,我选择HTTPClient同步数据调用。
谁能给我提个解决办法?
编辑
谢谢@Mike Richards为我指出正确的方向我想实现如下的流程,
从Main.xaml.cs调用aunticateuser() ->在进程类中调用aunticateuser()方法->一旦从服务返回控件获得响应,返回到main .xaml ->导航到另一个页面,即Dashboard.xaml
但在实际情况下,它的工作方式是,调用进程类中的aunticateuser()方法,它将请求发送到服务并返回到main . example .cs,但不在那里等待侦听响应,所以我将如何决定这个用户是有效的还是无效的,直到我得到响应?
private void ApplicationBarDone_Click(object sender, EventArgs e)
{
bool isValid = checkForValidation();
if (isValid)
{
string url = txtUrl.Text.ToString().TrimStart(' ').TrimEnd(' ');
string login = txtLogin.Text.ToString().TrimStart(' ').TrimEnd(' ');
string clientKey = txtSystemKey.Text.ToString().TrimStart(' ').TrimEnd(' ');
string psw = txtPassword.Text.ToString().TrimStart(' ').TrimEnd(' ');
RestfulWebServiceUserDAO userDAO = new RestfulWebServiceUserDAO();
userDAO.authenticateUser(login, psw, clientKey, url);
//navigate to another page from here ??
}
}
在RestfulWebServiceUserDAO类中存在authenticateUser()方法
public async override void authenticateUser(string login, string password, string clientkey, string systemurl)
{
string url = systemurl + "/rest/user?login=" + login + "&password=" + password + "&clientkey=" + clientkey + "&languageId=" + 1;
string result = await GetMyData(url);
//or shall I navigate from here?? this is not allowed :|
}
GetMyData()方法在RestfulWebServiceUserDAO类中与我上面标记的相同。
一旦你采用异步方式,你就需要一直同步到顶部。但是您需要始终返回一个可等待对象(通常是Task
)。
为事件处理程序和方法重写生成异常。但在这种情况下,这些将是即发即弃。
在你的代码中发生的是,虽然在你的authenticateUser
(按照惯例,应该被称为AuthenticateUserAsync
)方法中,你正在等待GetMyData(再次,GetMyDataAsync
)的结果,你没有返回任何可等待的结果给调用者。因为aysnc方法一碰到第一条await
语句就返回给调用者。
因此,当ApplicationBarDone_Click
调用userDAO.authenticateUser
时,它立即返回,因为它不是可等待的。
如果你不能改变authenticateUser
,你就不能使用async-await
。但在Windows Phone中,网络呼叫必须是异步的,你需要改变这一点。既然如此,您的AuthenticateUserAsync
方法(还记得约定吗?)应该看起来像这样:
public async override Task<string> AuthenticateUserAsync(string login, string password, string clientkey, string systemurl)
{
string url = systemurl + "/rest/user?login=" + login + "&password=" + password + "&clientkey=" + clientkey + "&languageId=" + 1;
return await GetMyDataAsync(url);
}
你的ApplicationBarDone_Click
应该看起来像这样:
private async void ApplicationBarDone_Click(object sender, EventArgs e)
{
bool isValid = checkForValidation();
if (isValid)
{
string url = txtUrl.Text.ToString().TrimStart(' ').TrimEnd(' ');
string login = txtLogin.Text.ToString().TrimStart(' ').TrimEnd(' ');
string clientKey = txtSystemKey.Text.ToString().TrimStart(' ').TrimEnd(' ');
string psw = txtPassword.Text.ToString().TrimStart(' ').TrimEnd(' ');
RestfulWebServiceUserDAO userDAO = new RestfulWebServiceUserDAO();
string result = await userDAO.AuthenticateUserAsync(login, psw, clientKey, url);
// do whatever you need to do after login.
// just remember that, during the call to userDAO.AuthenticateUserAsync
// the UI is responsive and the user can click again
}
}
了解更多asyn-await
编程,请阅读我的策展。
尝试等待GetMyData
string result = await GetMyData(url)