我正在尝试从数据库中的ASPNetUsers 表中获取一些自定义列值(经度,纬度(,当我发送Get请求抛出浏览器时,我得到一个200 ok与请求的json..但是当我尝试使用GetStringAsync在我的xamarin应用程序中反序列化响应时,我没有得到任何响应。
在帐户控制器类中
// 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 窗体应用中的 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;
}
从您的代码中不清楚是等待Task
还是您在Task
上调用.Result
或.GetAwaiter().GetResult()
。但是,正如我们在添加.ConfigureAwait(false)
评论中发现的那样,解决了您的问题。
这表示代码无法返回到它来自的上下文,因此添加.ConfigureAwait(false)
代码不会返回到上下文。
在您的情况下,上下文可能是 UI 线程,当它尝试返回 UI 线程时,该线程被阻止。
UI 线程被阻止的最可能情况是因为您以错误的方式调用了任务。如果在 UI 线程上使用 .Result
调用它,则会同步阻止 UI 线程,因此任何尝试返回到 UI 线程的内容都将死锁,因为您正在阻止它。
这里的简单解决方法是只在代码中添加.ConfigureAwait(false)
。更好的解决方案是不通过等待任务来阻止 UI 线程。