вызывается из клиента Blazor HttpClient.GetJsonAsync возвращает (с данными), но затем время ожидания - PullRequest
1 голос
/ 13 мая 2019

Я звоню Http.JsonAsync<MyType>("api/MyController/Users");, который очень быстро возвращается, но затем переходит в 5 секунд, а не дает мне данные.

Я сделал другие такие звонки, которые работали нормально, но происходит что-то странное.

Я начал со стандартного шаблона службы Blazor службы погоды и все работало нормально

Я стартую с кнопки события

<button onclick=@load_click>LOAD!</button>

@functions {
private void load_click()
{
    try
    {
        Logger.Log($"about to call PopulateExistingUsers");

        var taskUsers = Http.GetJsonAsync<UsersPageData>("api/ShowerQ/Users");

        Logger.Log($"returned from async requesting users");
        if (!taskUsers.Wait(5000))
        {
            throw new Exception($"timeout!");
        }
        var users = taskUsers.Result;
        Logger.Log($"populated existing users ok.  Users.Count = {users.Users.Count()}");
    }
    catch (Exception e)
    {
        Logger.Log(e.ToString());
    }
}

Код контроллера на стороне сервера:

[HttpGet("Users")]
public UsersPageData GetUsers()
{

    try
    {
        var users = _repos.GetAllUsers().ToList();
        Log($"returned from GetALlUsers() with {users.Count} users");

        return new UsersPageData() {Users = users};
    }
    finally
    {
        Log($"aft6er returning from method {nameof(GetUsers)}");
    }
}

Logger.Log просто делает Console.Writeline, что идет в консоль браузера - очень удобно!

Ожидаемое: вывод журнала в консоль: "Заполнены существующие пользователи в порядке. Users.Count = 3"

Актуальные журналы:

Вывод, который я получаю:

WASM: 09:31:26.49:about to call PopulateExistingUsers

WASM: 09:31:26.56:returned from async requesting users

WASM: 09:31:31.57:System.Exception: timeout!

WASM:   at ShowerQWeb2.Client.Pages.Index.load_click () [0x00048] in C:\Users\XXXX\Source\repos\ShowerQWeb2\ShowerQWeb2.Client\Pages\Index.razor:62 

и на стороне сервера (который работает на той же машине, поэтому часы синхронизируются не считая часа)

10:31:26.68:returned from GetALlUsers() with 3 users

10:31:26.68:aft6er returning from method GetUsers

Отладка сети Chrome показывает, что возвращается: заголовок ответа:

Date: Mon, 13 May 2019 09:31:26 GMT
{"users":[{"id":1,"name":"David XX"},{"id":2,"name":"Sumith YY"},{"id":3,"name":"David ZZ"}]}

Итак, похоже, что его застревание десериализовало?

1 Ответ

3 голосов
/ 13 мая 2019

Вы, вероятно, застряли в тупике, потому что злоупотребляете асинхронностью. Вы не должны звонить .Wait() и .Result, используйте асинхронный код правильно.

Сначала создайте метод async и верните Task:

private async Task load_click()
{
    // snip
}

Тогда await ваши HTTP-вызовы правильно:

var users = await Http.GetJsonAsync<UsersPageData>("api/ShowerQ/Users");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...