.NET 6 Web API 应用程序中的错误响应不一致
Inconsistent error response in .NET 6 Web API application
我无法找到如何抛出 .NET 6 Web 生成的异常 API。
如果我 return 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 字段响应。
我尝试添加一个中间件来捕获异常,但它不处理模型错误(由框架本身处理)。我如何全局处理错误,或者我如何抛出将被视为与框架处理它们相同的异常?欢迎任何 documentation/tutorial 链接!
您可以像下面的代码一样禁用默认的错误请求响应:
builder.Services.Configure<ApiBehaviorOptions>(options =>
{
options.SuppressModelStateInvalidFilter = true;
});
因此您可以 return 在 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());
...
}
如果你想 return 一个全局 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));
});
这只是您可以用来实现您想要的效果的方法之一,您可以在 Internet 上找到不同的方法。
在 .Net6 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);
}
}
然后在 Program.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;
});
我无法找到如何抛出 .NET 6 Web 生成的异常 API。
如果我 return 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 字段响应。
我尝试添加一个中间件来捕获异常,但它不处理模型错误(由框架本身处理)。我如何全局处理错误,或者我如何抛出将被视为与框架处理它们相同的异常?欢迎任何 documentation/tutorial 链接!
您可以像下面的代码一样禁用默认的错误请求响应:
builder.Services.Configure<ApiBehaviorOptions>(options =>
{
options.SuppressModelStateInvalidFilter = true;
});
因此您可以 return 在 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());
...
}
如果你想 return 一个全局 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));
});
这只是您可以用来实现您想要的效果的方法之一,您可以在 Internet 上找到不同的方法。
在 .Net6 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);
}
}
然后在 Program.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;
});