我只想从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
)。
我该如何绑定到模型绑定中,以对项目中的所有操作提供标准化的错误响应?
我已经阅读了很多文章,但是它们似乎都在讨论全局异常处理或验证错误。
答案 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,以返回所需的内容。