it-swarm-ko.tech

ASP.Net Core 모델 바인딩 오류를 어떻게 사용자 지정합니까?

웹 API (Asp.net Core 2.1)에서 표준화 된 오류 응답 만 반환하고 싶지만 모델 바인딩 오류를 처리하는 방법을 파악할 수 없습니다.

프로젝트는 "ASP.NET Core Web Application"> "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이 호출되지 않음).

프로젝트의 모든 작업에서 표준화 된 오류 응답을 제공하기 위해 모델 바인딩에 어떻게 연결합니까?

나는 많은 기사를 읽었지만 전역 예외 처리 또는 유효성 검사 오류에 대해 논의하는 것 같습니다.

13
Brian

ASP.NET Core 2.1에는 [ApiController] 속성이 추가되어 BadRequestObjectResult가 전달 된 ModelState을 반환하여 모델 유효성 검사 오류를 자동으로 처리한다는 점을 언급 할 가치가 있습니다. 즉, 해당 속성으로 컨트롤러를 꾸미면 더 이상 if (!ModelState.IsValid) 검사를 수행 할 필요가 없습니다.

또한 기능도 확장 가능합니다. Startup에서 다음을 추가 할 수 있습니다.

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

위의 내용은 기본적으로 이미 수행 된 내용이지만 원하는 것을 반환하기 위해 InvalidModelStateResponseFactory이 설정되어있는 람다를 사용자 지정할 수 있습니다.

29
Chris Pratt