ASP.NET Core обрабатывает проблемы десериализации JSON - PullRequest
1 голос
/ 19 сентября 2019

Я хотел бы изменить поведение по умолчанию при обработке недопустимых запросов JSON в ASP.NET Core.У меня есть эта модель:

public class Model
{
    public Guid Id { get; set; }
}

И когда я отправляю этот запрос с этим телом

{
 "Id": null
}

Он возвращает это сообщение об ошибке:

 "Error converting value {null} to type 'System.Guid'. Path 'Id', line 2, position 11."

Конечно, этоабсолютно логично, но я хочу, чтобы Id был установлен в значение по умолчанию (Guid.Empty) вместо неудачного запроса.Я добавил эту конфигурацию json при запуске:

services.AddMvc()
            .AddJsonOptions(options => options.SerializerSettings.Error = (a, e) =>
            {
                e.ErrorContext.Handled = true;
            })

Обработчик ошибок работает, однако ASP.NET Core по-прежнему возвращает ошибку.Это отличается от поведения в ASP.NET Web API, где это было возможно.

1 Ответ

0 голосов
/ 20 сентября 2019

Как вы обнаружили, это поведение обрабатывается JsonInputFormatter, вы можете настроить форматер таким образом, чтобы переопределить это поведение, например

  1. IgnoreGuidErrorJsonInputFormatter

    public class IgnoreGuidErrorJsonInputFormatter : JsonInputFormatter
    {
        public IgnoreGuidErrorJsonInputFormatter(ILogger logger, JsonSerializerSettings serializerSettings, ArrayPool<char> charPool, ObjectPoolProvider objectPoolProvider, MvcOptions options, MvcJsonOptions jsonOptions) : base(logger, serializerSettings, charPool, objectPoolProvider, options, jsonOptions)
        {
            serializerSettings.Error = (a, e) =>
            {
                var errors = e.ErrorContext.Error;
                e.ErrorContext.Handled = true;
            };
        }
    }
    
  2. Регистрация IgnoreGuidErrorJsonInputFormatter

    services.AddMvc(options =>
    {
        var serviceProvider = services.BuildServiceProvider();
        var customJsonInputFormatter = new IgnoreGuidErrorJsonInputFormatter(
                    serviceProvider.GetRequiredService<ILoggerFactory>().CreateLogger<IgnoreGuidErrorJsonInputFormatter>(),
                    serviceProvider.GetRequiredService<IOptions<MvcJsonOptions>>().Value.SerializerSettings,
                    serviceProvider.GetRequiredService<ArrayPool<char>>(),
                    serviceProvider.GetRequiredService<ObjectPoolProvider>(),
                    options,
                    serviceProvider.GetRequiredService<IOptions<MvcJsonOptions>>().Value
            );
        options.InputFormatters.Insert(0, customJsonInputFormatter);
    });
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...