用于调用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类中与我上面标记的相同。

用于调用REST服务的HTTPClient不工作

一旦你采用异步方式,你就需要一直同步到顶部。但是您需要始终返回一个可等待对象(通常是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)