Метод GetStringAsync не отвечает - PullRequest
0 голосов
/ 29 апреля 2018

Я пытаюсь получить некоторые пользовательские значения столбцов (долгота, широта) из таблицы ASPNetUsers из БД. Когда я отправляю браузер с запросом на получение запроса, я получаю 200 нормально с запрошенным 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;



    }

В классе ApiService в приложении xamarin форм

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 голосов
/ 30 апреля 2018

Из вашего кода неясно, ожидается ли Task или вы звоните .Result или .GetAwaiter().GetResult() на Task. Однако, как мы выяснили в комментариях, добавление .ConfigureAwait(false) исправило вашу проблему.

Это указывает на то, что код не может вернуться в контекст, из которого он получен, поэтому при добавлении .ConfigureAwait(false) код не возвращается в контекст.

В вашем случае контекст, вероятно, является потоком пользовательского интерфейса, и при попытке возврата поток пользовательского интерфейса блокируется.

Наиболее вероятный сценарий, по которому поток пользовательского интерфейса является блочным, заключается в том, что вы неправильно назвали свою задачу. Если вы вызываете его с помощью .Result в потоке пользовательского интерфейса, вы синхронно блокируете поток пользовательского интерфейса, поэтому все, что пытается вернуться в поток пользовательского интерфейса, блокируется, поскольку вы блокируете это.

Простое решение - просто добавить .ConfigureAwait(false) в ваш код. Лучшим решением было бы не блокировать поток пользовательского интерфейса, ожидая Задачу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...