Xamarin App不与WebApi通信

时间:2017-02-01 21:25:48

标签: c# android asp.net-web-api xamarin

我创建了Microsoft MVC WebApi来管理用户帐户 - 登录,注册帐户......

我在本地网络上的http://192.168.0.185

上有这个WebApi

当我打开这个"网站"在我的Android手机上 - 谷歌浏览器(http://192.168.0.185/Tokenhttp://192.168.0.185/api/login)我表明此WebApi正在运行。

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

有我的方法:(apiBaseUri = 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();
}

catch块没有发现任何错误...

// EDITED:

这是我的方法处理程序:

loginButton.Clicked += OnLoginButtonClicked;

这就是调用方法的方法:

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();
}

现在我收到此错误,屏幕被冻结。 Getting this error in Visual studio

1 个答案:

答案 0 :(得分:0)

听起来你正在混合堆栈中的同步和异步代码(死锁)。

事件处理程序中的阻塞调用GetAPIToken(...).Result是导致问题的原因(死锁)。在那里使用await代替它,应该修复它。

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();
}