gpt4 book ai didi

c# - 如何自定义 ASP.Net Core 模型绑定(bind)错误?

转载 作者:可可西里 更新时间:2023-11-01 08:03:24 29 4
gpt4 key购买 nike

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

该项目刚刚从“ASP.NET Core Web 应用程序”>“API”模板创建。我有一个简单的 Action 定义为:

[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 只是一个将错误转换为我想要返回的正确形状并将其放入响应中的类。它根本不会因模型绑定(bind)错误而被调用(没有抛出 Exception 并且没有调用 UseStatusCodePages)。

我如何连接到模型绑定(bind)中以在我的项目中的所有操作中提供标准化的错误响应?

我看过很多文章,但它们似乎都在讨论全局异常处理或验证错误。

最佳答案

值得一提的是,ASP.NET Core 2.1 添加了 [ApiController]属性,除其他外,它通过返回 BadRequestObjectResult 自动处理模型验证错误。与 ModelState传入。换句话说,如果你用那个属性装饰你的 Controller ,你就不再需要做 if (!ModelState.IsValid)检查。

此外,该功能也是可扩展的。在 Startup ,你可以添加:

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

以上只是默认情况下已经发生的情况,但您可以 customize the lambda that InvalidModelStateResponseFactory is set to为了返回你喜欢的任何东西。

关于c# - 如何自定义 ASP.Net Core 模型绑定(bind)错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51145243/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com