我试图从数据库中的ASPNetUsers表中获取一些自定义列值(经度,纬度),当我发送一个Get请求抛出浏览器时,我得到了一个200 ok的请求json ..但是当我尝试使用GetStringAsync反序列化我的xamarin应用程序中的响应我没有得到任何响应。
在AccountController类
中// POST api/Account/GetUserPostion
[Route("GetUserPostion")]
public LocationDataToPostAsync GetUserPostion()
{
var store = new UserStore<ApplicationUser>(new ApplicationDbContext());
var manager = new ApplicationUserManager(store);
LocationDataToPostAsync locationData = new LocationDataToPostAsync();
var model = manager.FindById(User.Identity.GetUserId());
locationData.UserId = User.Identity.GetUserId();
if (model.Longitude != null) locationData.Longitude = (double) model.Longitude;
if (model.Latitude != null) locationData.Latitude = (double) model.Latitude;
return locationData;
}
在xamarin表单app中的ApiService类中
public async Task<LocationDataToPostAsync> GetUserLocationAsync(string accessToken)
{
HttpClient client = new HttpClient();
client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", accessToken);
var json = await client.GetStringAsync("http://10.0.2.2:45455/api/Account/GetUserPostion");
var location = JsonConvert.DeserializeObject<LocationDataToPostAsync>(json);
return location;
}
答案 0 :(得分:0)
您的代码中不清楚是否等待Task
,或者您在.Result
上呼叫.GetAwaiter().GetResult()
或Task
。但是,正如我们在评论中发现的那样,.ConfigureAwait(false)
修复了您的问题。
这表示代码无法返回到它所来自的上下文,因此添加.ConfigureAwait(false)
代码不会返回上下文。
在您的情况下,上下文可能是UI线程,当它尝试返回UI线程时被阻止。
UI线程阻塞的最可能的情况是因为您以错误的方式调用了您的任务。如果你在UI线程上用.Result
调用它同步阻塞UI线程,那么任何试图返回到UI线程的东西都会死锁,因为你阻止了它。
这里的简单解决方法是在代码中添加.ConfigureAwait(false)
。更好的解决方案是不要通过等待任务来阻止UI线程。