如何自定义ASP.Net Core模型绑定错误?
我想从Web API(Asp.net Core 2.1)返回标准化的错误响应,但我似乎无法弄清楚如何处理模型绑定错误。
该项目只是从“ASP.NET Core Web Application”>“API”模板创建的。 我有一个简单的动作定义为:
[Route("[controller]")] [ApiController] public class MyTestController : ControllerBase { [HttpGet("{id}")] public ActionResult 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
)。
如何挂钩模型绑定以在我的项目中的所有操作中提供标准化的错误响应?
我读了很多文章,但他们似乎都在讨论全局exception处理或validation错误。
值得一提的是,ASP.NET Core 2.1添加了[ApiController]
属性,除其他外,它通过返回传入ModelState
的BadRequestObjectResult
自动处理模型validation错误。换句话说,如果用该属性装饰控制器,则不会更长时间需要进行if (!ModelState.IsValid)
检查。
此外,该function也是可扩展的。 在Startup
,您可以添加:
services.Configure(o => { o.InvalidModelStateResponseFactory = actionContext => new BadRequestObjectResult(actionContext.ModelState); });
以上就是默认情况下已经发生的事情,但是您可以在那里自定义设置InvalidModelStateResponseFactory
的lambda,以便返回您喜欢的任何内容。