MissingMemberHandling.Error force исключение при десериализации тела HTTP - PullRequest
1 голос
/ 02 октября 2019

Я создаю спокойный веб-сервис с использованием .net и Newtonsoft для сериализации / десериализации.

Цель состоит в том, чтобы форсировать исключения (предпочтительно HTTP 400), когда обязательное свойство не включено в запрос.

  1. Конфигурация сериализатора

    config.Formatters.JsonFormatter.SerializerSettings = new JsonSerializerSettings {
            MissingMemberHandling = MissingMemberHandling.Error,
            Error = delegate (object x, ErrorEventArgs error) {
                System.Diagnostics.Debug.WriteLine (error.ErrorContext.Error);
                throw new Exception("");
        }
    };
    
  2. Модель

    [DataContract]
    public class MyObject {
        [JsonProperty(PropertyName = "id", Required = Required.Always)]
        public string Id { get; set; }
    }
    
  3. Конечная точка отдыха

    public IHttpActionResult MyAction([FromBody]MyObject request)
    

Тестирование:

Когда запрос запускается, поток выглядит следующим образом:

  1. Точка останова делегата ошибок достигает («1. Конфигурация сериализатора»), и я могу видеть журнал ошибок. Ошибка «проглочена», и выполнение продолжается в контроллере.
  2. Выполнение не выполняется в другой части веб-службы.

Следовательно ... я могу перехватитьошибка при использовании делегата, но не в состоянии его распространения (повторная установка делегата вообще не имеет значения).

Не справедливо ли ожидать этого, установив MissingMemberHandling. Ошибка ', я должен увидеть ошибку в моем контроллере?

Разве не справедливо ожидать, что, указав свойство как' required ', я действительно должен увидеть ошибку в моем контроллере?


Цель:

Вместо тихого сбоя, я хотел бы вызвать ошибку, когда происходит сбой десериализации тела HTTP.

1 Ответ

0 голосов
/ 05 октября 2019

Единственный законный способ найти ошибки десериализации - это проверить объект ModelState.

if (!ModeState.IsValid) {
    return BadRequest(ModelState);
}

Это было добавлено вверху контроллера.

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