.NET 6 Web API应用程序中的错误响应不一致



我找不到如何抛出异常,因为它们是由.NET 6 Web API生成的。如果我返回添加了错误的BadRequest(ModelState),我将不会得到与状态、类型、标题等相同的消息。默认情况下,当验证错误发生时,.NET会生成这种错误:

{
"type": "https://tools.ietf.org/html/rfc7231#section-6.5.1",
"title": "One or more validation errors occurred.",
"status": 400,
"traceId": "00-488f8c0057223cbba92fc1fbfc8865d8-2341d7aba29d098f-00",
"errors": {
"$": [
"The JSON object contains a trailing comma at the end which is not supported in this mode. Change the reader options. Path: $ | LineNumber: 7 | BytePositionInLine: 0."
],
"model": [
"The model field is required."
]
}

}

我想将我的应用程序配置为使用相同的错误JSON进行响应,或者我想将其配置为使用自定义JSON字段进行响应。

我试图添加一个中间件来捕获异常,但它不处理模型错误(这些错误由框架自己处理(。我如何全局处理错误,或者如何抛出将与框架处理错误相同的异常?欢迎任何文档/教程链接!

您可以禁用默认的错误请求响应,如以下代码:

builder.Services.Configure<ApiBehaviorOptions>(options =>
{
options.SuppressModelStateInvalidFilter = true;
});

因此,您可以在BadRequest中返回您想要的任何模型。然而,您必须在每个端点中自己进行模型验证,如:

[HttpPost(Name = "Post1")]
public IActionResult Post1(Model1 model)
{
if (!ModelState.IsValid)
return BadRequest(new CustomApiResponse());
...
}
[HttpPost(Name = "Post2")]
public IActionResult Post2(Model2 model)
{
if (!ModelState.IsValid)
return BadRequest(new CustomApiResponse());
...
}

如果您想返回一个全局JSON结构,您可以使用ActionFilterAttribute创建一个过滤器,并将其用于所有端点,这样您就不需要对每个端点进行模型验证。

自定义验证过滤器:

public class CustomValidationFilterAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext context)
{
if (!context.ModelState.IsValid)
{
context.Result = new BadRequestObjectResult(new GlobalApiResponse());
}
base.OnActionExecuting(context);
}
}

您需要在Program.cs 中注册您的自定义过滤器

builder.Services.AddControllers(options =>
{
options.Filters.Add(typeof(CustomValidationFilterAttribute));
});

这只是你可以用来实现你想要的东西的方法之一,你可以在互联网上找到不同的方法。

在.Net 6 Web Api中,如果你想通过代码验证模型,并且你可以调试它,只需这样做:

public class ModelValidationFilterAttribute : ActionFilterAttribute
{
public override Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
{
if (!context.ModelState.IsValid)
{
context.Result = new BadRequestObjectResult(new BaseResponse() { code = ResponseCode.失败, msg = "" });
}
return base.OnActionExecutionAsync(context, next);
}
}

然后在程序中执行.cs

// Add services to the container.
builder.Services.AddControllers(options =>
{
//Add Your Filter
options.Filters.Add<ModelValidationFilterAttribute>();
}).ConfigureApiBehaviorOptions(options =>
{
//Disable The Default
options.SuppressModelStateInvalidFilter = true;
});

最新更新