Asp.Net Core REST api: поймать ошибку сериализации модели и вернуть явное сообщение - PullRequest
0 голосов
/ 01 ноября 2018

Вот моя проблема, я разрабатываю REST API в ядре Asp.Net, которое используется некоторыми разработчиками. Решение - это настройка для автоматической генерации документации на swagger, что делает тестирование API довольно быстрым и легким. Некоторые из методов POST получают огромные объекты json через тело запроса, и как только одно из свойств генерирует ошибку сериализации (например, помещая строку в целочисленное поле), модель, полученная в моем контроллере, становится нулевой. Затем разработчики теряют некоторое время, чтобы выяснить, в какой области происходит сбой сериализации. Я хотел бы иметь возможность не только отлавливать эти ошибки, но и возвращать разработчикам явное сообщение, чтобы указать поле, вызывающее ошибку. Я могу поймать ошибку, сделав это в Startup.cs file

services.AddMvc()
        .AddJsonOptions(options =>
        {
            options.SerializerSettings.Error = (sender, args) =>
            {

            };
        });

на данный момент у меня есть подробности ошибки сериализации. Я мог бы зарегистрировать ошибку, но я хотел бы вернуть 400 с явным сообщением. Я попытался запутать некоторые вещи, такие как следующие, чтобы получить ответ http, но не смог этого достичь.

var provider = services.BuildServiceProvider();
var http = (IHttpContextAccessor)provider.GetService(typeof(IHttpContextAccessor));
var response = http.HttpContext.Response;

1 Ответ

0 голосов
/ 02 ноября 2018

Для обнаружения ошибки модели вы можете попробовать ModelState, и вы можете попробовать код ниже, чтобы вернуть 400 с подробным сообщением об ошибке.

        [HttpPost("PostWithInValidate")]
    public async Task<IActionResult> PostWithInValidate([FromBody]InValidateVM vM)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }
        return Ok(vM);
    }

Примечание

В соответствии с предложением @Kirk Larin, если вы можете использовать атрибут [ApiController] на контроллере, нет необходимости использовать приведенный выше код.

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