Escribí un filtro de excepción para mi API para manejar las excepciones lanzadas en la API:
using System; using System.Net; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Filters; [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)] public class ApiExceptionFilter : ExceptionFilterAttribute { public override void OnException(ExceptionContext context) { // First, generate the status code based on the exception type HttpStatusCode status = context.Exception switch { UnauthorizedAccessException => HttpStatusCode.Unauthorized, ArgumentException => HttpStatusCode.BadRequest, MissingHeaderException => HttpStatusCode.BadRequest, NotFoundException => HttpStatusCode.NotFound, _ => HttpStatusCode.InternalServerError, }; // Next, inject the status code and exception message into // a new error response and set the result with it context.Result = new JsonResult(new ErrorResponse { StatusCode = status, Message = context.Exception.Message }); // Finally, call the base function base.OnException(context); } }Esta función intercepta excepciones como se esperaba, pero el problema que tengo es que siempre devuelve una respuesta OK. ¿Cómo me aseguro de que la respuesta incluya el mensaje de excepción y que el código de respuesta no sea un valor 200?
En lugar de devolver un JsonResult , que no expone una propiedad de código de estado para establecer, devuelva un ExceptionResult y establezca el código de estado de la siguiente manera:
context.Result = new ExceptionResult(context.Exception, true) { StatusCode = status };Si aún desea usar su objeto ErrorResponse, simplemente use un resultado de objeto:
context.Result = new ObjectResult(new ErrorResponse { StatusCode = status, Message = context.Exception.Message }) // set status code on result { StatusCode = status };