如何自定义ASP.Net Core模型绑定错误?

时间:2018-07-03 00:39:17

标签: c# asp.net-core asp.net-core-webapi asp.net-core-middleware

我只想从Web API(Asp.net Core 2.1)返回标准化的错误响应,但是我似乎无法弄清楚如何处理模型绑定错误。

该项目只是通过“ ASP.NET Core Web应用程序”>“ 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 :(得分:19)

值得一提的是,ASP.NET Core 2.1添加了[ApiController]属性,该属性除其他外,通过返回传入的BadRequestObjectResult的{​​{1}}自动处理模型验证错误。换句话说,如果您使用该属性装饰控制器,则不再需要进行ModelState检查。

此外,该功能也是可扩展的。在if (!ModelState.IsValid)中,您可以添加:

Startup

以上只是默认情况下已经发生的事情,但是您可以在其中自定义设置services.Configure<ApiBehaviorOptions>(o => { o.InvalidModelStateResponseFactory = actionContext => new BadRequestObjectResult(actionContext.ModelState); }); 的lambda,以返回所需的内容。