我想从Web API(
Asp.net Core 2.1)中仅返回标准化的错误响应,但我似乎无法弄清楚如何处理模型绑定错误.
该项目只是从“ASP.NET核心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).
如何挂钩模型绑定以在我的项目中的所有操作中提供标准化的错误响应?
解决方法
值得一提的是,ASP.NET Core 2.1添加了[ApiController]属性,除其他外,它通过返回传入ModelState的BadRequestObjectResult来自动处理模型验证错误.换句话说,如果用该属性装饰控制器,则不会更长时间需要执行if(!ModelState.IsValid)检查.
services.Configure<ApiBehaviorOptions>(o => { o.InvalidModelStateResponseFactory = actionContext => new BadRequestObjectResult(actionContext.ModelState); });
以上就是默认情况下已经发生的事情,但您可以在那里自定义设置InvalidModelStateResponseFactory的lambda,以便返回您喜欢的任何内容.