我创建了Microsoft MVC WebApi来管理用户帐户 - 登录,注册帐户......
我在本地网络上的http://192.168.0.185
当我打开这个"网站"在我的Android手机上 - 谷歌浏览器(http://192.168.0.185/Token
,http://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();
}
答案 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();
}