Правильный способ обработки многократных асинхронных запросов HTTP с обработкой ошибок - PullRequest
0 голосов
/ 12 апреля 2019

Решение работает, но есть лучший способ для обработки нескольких запросов, подобных этому, с обработкой ошибок.

Приведенный ниже код описывает, что я хочу сделать, и абсолютно работает.Но я уверен, что есть лучший способ решить эту проблему?Я пробовал и другие варианты, но он не работает, так как некоторые запросы возвращают 404.

public async Task<List<Bruker>> TryGetContactsByContactIds(List<AZContact> contacts)
{
    var tasks = contacts.Select(c => TryGetContactAsync(c.Email)).Where(c => c.Result != null);

    try
    {
        var tasksresult = await Task.WhenAll(tasks);
        return tasksresult.ToList();
    }
    catch (Exception e)
    {
        _logger.Error("unable to fetch all", e);
    }


    return new List<Bruker>();
}

public async Task<Bruker> TryGetContactAsync(string userId)
{
    try
    {
        var user = await _brukereClient.GetAsync(userId);
        return user;
    }
    catch (SwaggerException e)
    {
        if (e.StatusCode == 404)
        {
            _logger.Info($"user with Id {userId} does not exist");
        }
        else
        {
            _logger.Error("Unable to fetch user", e);
        }
    }

    return null;
}

1 Ответ

0 голосов
/ 12 апреля 2019

Вы, вероятно, имеете дело с функцией / ограничением await, которое выдает только одно из агрегированных исключений ожидаемой задачи (задача WhenAll в данном случае).Вы должны перечислить все задачи для обработки каждого отдельного исключения.

try
{
    var tasksresult = await Task.WhenAll(tasks);
    return tasksresult.ToList();
}
catch (Exception e)
{
    foreach (var task in tasks)
    {
        if (task.IsFaulted)
        {
            var taskException = task.Exception.InnerException;
            // ^^ Assuming that each task cannot have more than one exception inside its AggregateException.
            if (taskException is SwaggerException swaggerException)
            {
                if (swaggerException.StatusCode == 404)
                {
                    _logger.Info($"user with Id {userId} does not exist");
                }
                else
                {
                    _logger.Error("Unable to fetch user", swaggerException);
                }
            }
            else
            {
                _logger.Error("An unexpected task error occurred", taskException);
            }
        }
    }
    if (!tasks.Any(t => t.IsFaulted))
    {
        _logger.Error("A non task-related error occurred", e);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...