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

前端之家收集整理的这篇文章主要介绍了c# – 如何自定义ASP.Net Core模型绑定错误?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想从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)检查.

此外,该功能也是可扩展的.在Startup中,您可以添加

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

以上就是默认情况下已经发生的事情,但您可以在那里自定义设置InvalidModelStateResponseFactory的lambda,以便返回您喜欢的任何内容.

猜你在找的.NET Core相关文章