Недопустимая ошибка свойства класса модели в. net основном API - PullRequest
0 голосов
/ 05 февраля 2020

Когда я отправляю метод post от почтальона. net Базовый API с недопустимым свойством класса модели, например, класс модели содержит длинное поле, но я отправляю строковое значение, я получаю ошибку в почтальоне, но я не получаю ошибку в catch method

    [HttpPost]
    public async Task<IActionResult> CalculateFee(CollegeGetModel collegeModel)
    {
        try
        {
            return await _collegeService.CalculateFee(collegeModel);
        }
        catch (Exception ex)
        {
            return ex.Message;
        }
    }

и класс модели

public class CollegeGetModel {
   public long Id {get;set;}
   public string Name {get;set;}
}

, а возвращаемое сообщение об ошибке

{
"errors": {
    "Id": [
        "Error converting value \"str\" to type 'System.Int64'. Path 'Id', line 2, position 20."
    ]
},
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "0HLTA1MNU7LV5:00000001"
}

Я не получаю это сообщение об ошибке в методе catch контроллера. Как получить это сообщение об ошибке в методе контроллера?

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

В ASP. NET Core Web API, привязка модели происходит до того, как ваш код в действии будет выполнен. Следовательно, если возникает ошибка проверки состояния модели, это приводит к автоматическому c 400 коду ответа и, следовательно, он не будет выполнять ваш блок catch внутри метода действия.

Для получения более подробной информации см. Эту ссылку и эту .

Редактировать: Удалена ссылка ASP. Net Web Api 2 : HTTP Message Lifecycle

ОБНОВЛЕНИЕ: Вы можете отключить этот автоматический c 400 ответ, добавив следующий код в Startup.ConfigureServices:

ASP. Net Core 2.1

services.Configure<ApiBehaviorOptions>(options =>
{
    options.SuppressConsumesConstraintForFormFileParameters = true;
    options.SuppressInferBindingSourcesForParameters = true;
    options.SuppressModelStateInvalidFilter = true;
});

ASP. Net Core 3.1

services.AddControllers()
        .ConfigureApiBehaviorOptions(options =>
        {
            options.SuppressConsumesConstraintForFormFileParameters = true;
            options.SuppressInferBindingSourcesForParameters = true;
            options.SuppressModelStateInvalidFilter = true;
            options.SuppressMapClientErrors = true;
            options.ClientErrorMapping[404].Link =
                "https://httpstatuses.com/404";
        });
0 голосов
/ 05 февраля 2020

В базовом веб-API ASP. NET все недопустимые привязки модели хранятся в свойстве ModelState. Однако, поскольку pNet ядро ​​автоматически возвращает неверный запрос, если ModelState недопустим, используя атрибут ApiController в верхней части класса Controller.

Чтобы перехватить запрос, необходимо закомментировать атрибут ApiController.

[Route("api/[controller]")]
//[ApiController]
public class HomeController : ControllerBase
{
    [HttpPost]
    public async Task<IActionResult> CalculateFee(CollegeGetModel collegeModel)
    {
        if (!ModelState.IsValid)
        {
            // Do whatever you want here. E.g: Logging
        }
        return await _collegeService.CalculateFee(collegeModel);
    }
}
...