Перейти к содержанию

Получаем ошибки валидации сообщений на сервере

В Главе 5 мы рассмотрели, как можно преодолеть нехватку встроенной валидации сообщений в ASP.NET Core gRPC. Автор предлагает решение, которое отправляет ошибки валидации в структурированной форме, которая содержит:

  • имя свойства, не прошедшего валидацию;
  • значение свойства, не прошедшее валидацию;
  • сообщение об ошибке.

Для того, чтобы легче было получить и интерпертировать такие сообщения, автор подготовил клиентский NuGet-пакет Calzolari.Grpc.Net.Client.Validation. Этот пакет предоставляет метод расширения GetValidationErrors(). Вот как предлагается его использовать:

async Task CreateWithValidationError(CountryServiceClient client, ILogger logger)
{
    using var bidirectionalStreamingCall = client.Create();
    var countriesToCreate = new List<CountryCreationRequest>
    {
        new CountryCreationRequest
        {
            Name = "Japan",
            Description = "", // Нарушает правило "минимум 5 символов
            CreateDate =  Timestamp.FromDateTime(DateTime.SpecifyKind(DateTime.UtcNow, DateTimeKind.Utc))
        }
    };
    try
    {
        // Записываем
        foreach (var request in countriesToCreate)
        {
            await bidirectionalStreamingCall.RequestStream.WriteAsync(request);
            logger.LogInformation($"Country {request.Name} set for creation");
        }

        // Сообщаем серверу о завершении передачи
        await bidirectionalStreamingCall.RequestStream.CompleteAsync();
        // Читаем поток с сервера
        await foreach (var createdCountry in bidirectionalStreamingCall.ResponseStream.ReadAllAsync())
        {
            logger.LogInformation($"{createdCountry.Name} has been created with Id {createdCountry.Id}");
        }
    }
    catch (RpcException ex) when (ex.StatusCode == StatusCode.InvalidArgument)
    {
        var errors = ex.GetValidationErrors();
        logger.LogWarning($"validation error message: {ex.Message}{Environment.NewLine}Errors:{Environment.NewLine}{JsonSerializer.Serialize(errors, new JsonSerializerOptions { WriteIndented = true })}");
    }
    catch (Exception e)
    {
        logger.LogWarning(e, e.Message);
    }
}

Если мы запустим этот запрос, то увидим в логах такую запись уровня Warn:
warn: CreateWithValidationError[0]
      validation error message: Status(StatusCode="InvalidArgument", Detail="Property Description failed validation. Error code was: MinimumLengthValidator Error was: Description is mandatory and should be longer than 4 characters")
      Errors:
      [
        {
          "PropertyName": "Description",
          "ErrorMessage": "Description is mandatory and should be longer than 4 characters",
          "AttemptedValue": ""
        }
      ]


Последнее обновление : 23 апреля 2023 г.
Дата создания : 23 апреля 2023 г.

Комментарии

Комментарии