Как настроить ошибки привязки модели ASP.Net Core? - PullRequest
0 голосов
/ 03 июля 2018

Я хотел бы возвращать только стандартизированные ответы об ошибках из моего Web API (Asp.net Core 2.1), но я не могу понять, как обрабатывать ошибки привязки модели.

Проект только что создан из шаблона «Базовое веб-приложение ASP.NET»> «API». У меня есть простое действие, определенное как:

[Route("[controller]")]
[ApiController]
public class MyTestController : ControllerBase
{
    [HttpGet("{id}")]
    public ActionResult<TestModel> Get(Guid id)
    {
        return new TestModel() { Greeting = "Hello World!" };
    }
}

public class TestModel
{
    public string Greeting { get; set; }
}

Если я сделаю запрос на это действие с недействительным Guid (например, https://localhost:44303/MyTest/asdf), я получу следующий ответ:

{
    "id": [
        "The value 'asdf' is not valid."
    ]
}

У меня есть следующий код в Startup.Configure:

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    JsonErrorMiddleware.CreateSingleton(env);

    if (!env.IsDevelopment())
    {
        app.UseHsts();
    }

    app
        .UseHttpsRedirection()
        .UseStatusCodePages(async ctx => { await JsonErrorMiddleware.Instance.Invoke(ctx.HttpContext); })
        .UseExceptionHandler(new ExceptionHandlerOptions() { ExceptionHandler = JsonErrorMiddleware.Instance.Invoke })
        .UseMvc()
}

JsonErrorMiddleware - это просто класс, который преобразует ошибки в правильную форму, которую я хочу вернуть, и помещает их в ответ. Он не вызывается вообще для ошибок привязки модели (не выдается Exception и UseStatusCodePages не вызывается).

Как подключиться к привязке модели, чтобы обеспечить стандартизированный ответ об ошибке для всех действий в моем проекте?

Я прочитал кучу статей, но все они, похоже, либо обсуждают глобальную обработку исключений, либо ошибки проверки.

1 Ответ

0 голосов
/ 03 июля 2018

Стоит отметить, что в ASP.NET Core 2.1 добавлен атрибут [ApiController], который, помимо прочего, автоматически обрабатывает ошибки проверки модели, возвращая BadRequestObjectResult с ModelState, переданным внутрь. Другими словами, если вы украшаете свой контроллеры с этим атрибутом, вам больше не нужно проверять if (!ModelState.IsValid).

Кроме того, функциональность также расширяема. В Startup вы можете добавить:

services.Configure<ApiBehaviorOptions>(o =>
{
    o.InvalidModelStateResponseFactory = actionContext =>
        new BadRequestObjectResult(actionContext.ModelState);
});

Вышесказанное - это то, что уже происходит по умолчанию, но вы можете настроить лямбду там, на которую установлена ​​InvalidModelStateResponseFactory, чтобы возвращать все, что вам нравится.

...