GetStringAsync 方法没有响应



我正在尝试从数据库中的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 线程。

相关内容

  • 没有找到相关文章

最新更新