C# Xamarin应用程序没有';t与WebApi通信

C# Xamarin应用程序没有';t与WebApi通信,c#,android,asp.net-web-api,xamarin,C#,Android,Asp.net Web Api,Xamarin,我创建了Microsoft MVC WebApi用于管理用户帐户-登录、注册帐户 我在http://192.168.0.185 private async Task<string> GetAPIToken(string userName, string password, string apiBaseUri) { JObject jObject = null; try { using (var client = new HttpClient

我创建了Microsoft MVC WebApi用于管理用户帐户-登录、注册帐户

我在
http://192.168.0.185

private async  Task<string> GetAPIToken(string userName, string password, string apiBaseUri) {

    JObject jObject = null;
    try
    {
        using (var client = new HttpClient())
        {

            client.BaseAddress = new Uri(apiBaseUri);
            client.DefaultRequestHeaders.Accept.Clear();
            client.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/json"));

            var formContent = new FormUrlEncodedContent(new[] {
                new KeyValuePair<string, string>("grant_type", "password"),
                new KeyValuePair<string, string>("username", userName),
                new KeyValuePair<string, string>("password", password)
            });

            HttpResponseMessage responseMessage = await client.PostAsync("/Token", formContent);

            var responseJson = await responseMessage.Content.ReadAsStringAsync();
            jObject = JObject.Parse(responseJson);

        }           
    }
    catch (Exception ex)
    {

    }

    return jObject.GetValue("access_token").ToString();
}
当我在我的Android手机上打开这个“站点”时-谷歌Chrome(
http://192.168.0.185/Token
http://192.168.0.185/api/login
)我展示了这个WebApi正在工作

现在,我尝试从Xamarin.Forms(部署在Android上)中尝试这个WebApi。当我点击submit按钮(它会将请求发送到服务器)时,似乎什么都没有发生(应用程序冻结一段时间后)。此外,当我尝试调试此代码时,似乎什么也没发生:(

这是我的方法:(
apiBaseUri=http://192.168.0.185

这就是方法的调用方式:

async void OnLoginButtonClicked(object sender, EventArgs e    ) {

    try {
        var token = GetAPIToken(usernameEntry.Text, passwordEntry.Text, "http://192.168.0.185").Result;
    }
    catch (Exception ex)
    {

    }

    App.IsUserLoggedIn = true;
    Navigation.InsertPageBefore(new MainPage(), this);
    await Navigation.PopAsync();
}
现在我得到这个错误,屏幕被冻结。

听起来像是将同步和异步代码混合在堆栈的更高层(死锁)

事件处理程序中的阻塞调用
GetAPIToken(…).Result
是导致问题(死锁)的原因。在那里使用
wait
,这应该可以解决问题

async void OnLoginButtonClicked(object sender, EventArgs e    ) {

    try {
        var token = await GetAPIToken(usernameEntry.Text, passwordEntry.Text, "http://192.168.0.185");
    } catch (Exception ex) {

    }

    App.IsUserLoggedIn = true;
    Navigation.InsertPageBefore(new MainPage(), this);
    await Navigation.PopAsync();
}

听起来你在堆栈的更高层混合了同步和异步代码(死锁)。显示如何调用上述函数。我找不到你发布的代码有任何问题,正如你所说,这里没有例外,因此我同意Nkosi,请显示如何调用此
GetAPIToken
任务。您好:)我添加了一些传统信息:)@user1912372下次向某人发表评论时,请包含
@
。我只是在帖子关闭后才注意到你的更新。事件处理程序中的阻塞调用
GetAPIToken(…).Result
是导致问题(死锁)的原因。在那里使用
等待
,这样可以解决问题。
async void OnLoginButtonClicked(object sender, EventArgs e    ) {

    try {
        var token = await GetAPIToken(usernameEntry.Text, passwordEntry.Text, "http://192.168.0.185");
    } catch (Exception ex) {

    }

    App.IsUserLoggedIn = true;
    Navigation.InsertPageBefore(new MainPage(), this);
    await Navigation.PopAsync();
}