No puedo encontrar cómo lanzar excepciones, ya que son generadas por .NET 6 Web API. Si devuelvo BadRequest(ModelState) con errores agregados, no obtengo el mismo mensaje con estado, tipo, título, etc. Por defecto, .NET genera este tipo de errores cuando ocurre un error de validación:
{ "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." ] }}
Quiero configurar mi aplicación para que responda con el mismo error JSON, o quiero configurarla para que responda con los campos JSON personalizados.
Traté de agregar un middleware que detectará excepciones, pero no maneja los errores del modelo (que son manejados por el marco por sí mismo). ¿Cómo puedo manejar los errores globalmente, o cómo puedo lanzar excepciones que serán tratadas de la misma manera que el marco las maneja? ¡Cualquier enlace de documentación/tutorial es bienvenido!
Puede deshabilitar las respuestas de solicitud incorrectas predeterminadas como el siguiente código:
builder.Services.Configure<ApiBehaviorOptions>(options => { options.SuppressModelStateInvalidFilter = true; }); Así que puedes devolver cualquier modelo que quieras en BadRequest . Sin embargo, luego debe hacer la validación del modelo usted mismo en cada punto final como:
[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()); ... } Si desea devolver una estructura JSON global, puede crear un filtro con ActionFilterAttribute y usarlo para todos sus puntos finales, por lo que no necesita realizar la validación del modelo en cada punto final.
Filtro de validación personalizado:
public class CustomValidationFilterAttribute : ActionFilterAttribute { public override void OnActionExecuting(ActionExecutingContext context) { if (!context.ModelState.IsValid) { context.Result = new BadRequestObjectResult(new GlobalApiResponse()); } base.OnActionExecuting(context); } }Debe registrar su filtro personalizado en Program.cs
builder.Services.AddControllers(options => { options.Filters.Add(typeof(CustomValidationFilterAttribute)); });Esta es solo una de las formas que puede usar para lograr lo que desea, puede encontrar diferentes métodos en Internet.
En .Net6 Web Api, si desea validar el modelo por su código y puede depurarlo, simplemente haga esto:
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); } }Entonces hazlo en el 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; });