GetStringAsync方法无法响应

时间:2018-04-29 17:05:14

标签: json web-services xamarin asp.net-web-api xamarin.forms

我试图从数据库中的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;

    }

1 个答案:

答案 0 :(得分:0)

您的代码中不清楚是否等待Task,或者您在.Result上呼叫.GetAwaiter().GetResult()Task。但是,正如我们在评论中发现的那样,.ConfigureAwait(false)修复了您的问题。

这表示代码无法返回到它所来自的上下文,因此添加.ConfigureAwait(false)代码不会返回上下文。

在您的情况下,上下文可能是UI线程,当它尝试返回UI线程时被阻止。

UI线程阻塞的最可能的情况是因为您以错误的方式调用了您的任务。如果你在UI线程上用.Result调用它同步阻塞UI线程,那么任何试图返回到UI线程的东西都会死锁,因为你阻止了它。

这里的简单解决方法是在代码中添加.ConfigureAwait(false)。更好的解决方案是不要通过等待任务来阻止UI线程。