he encontrado la solución here
tuve que crear un filtro de acción para anular el comportamiento por defecto de la MVC
Aquí está mi clase de excepción
class ValidationException : ApplicationException
{
public JsonResult exceptionDetails;
public ValidationException(JsonResult exceptionDetails)
{
this.exceptionDetails = exceptionDetails;
}
public ValidationException(string message) : base(message) { }
public ValidationException(string message, Exception inner) : base(message, inner) { }
protected ValidationException(
System.Runtime.Serialization.SerializationInfo info,
System.Runtime.Serialization.StreamingContext context)
: base(info, context) { }
}
Tenga en cuenta que tengo constructor que inicializa mi JSON. Aquí está el filtro de acción
public class HandleUIExceptionAttribute : FilterAttribute, IExceptionFilter
{
public virtual void OnException(ExceptionContext filterContext)
{
if (filterContext == null)
{
throw new ArgumentNullException("filterContext");
}
if (filterContext.Exception != null)
{
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true;
filterContext.HttpContext.Response.StatusCode = (int)System.Net.HttpStatusCode.InternalServerError;
filterContext.Result = ((ValidationException)filterContext.Exception).myJsonError;
}
}
Ahora que tengo el filtro de la acción, voy a decorar mi controlador con el atributo de filtro
[HandleUIException]
public JsonResult UpdateName(string objectToUpdate)
{
var response = myClient.ValidateObject(objectToUpdate);
if (response.errors.Length > 0)
throw new ValidationException(Json(response));
}
Cuando el error es lanzado el filtro de acción que implementa IExceptionFilter ser llamado y Devuelvo el Json al cliente en caso de devolución de llamada por error.
En caso de que el lector piense "¿Es todo lo necesario?", La respuesta es "no". - Estaba en la misma situación que @Sarath y quería devolver un código de error HTTP y algunos datos JSON que describían el error. Resultó que solo podía usar las líneas donde se borró la respuesta, los errores personalizados de IIS se omiten y el código de estado es sat. Puse esas 3 líneas en mi Acción en mi Controlador, y después de esas 3 líneas, simplemente devolví mis datos JSON como siempre. Trabajado como un encanto. –
De hecho, es cierto, pero para ser reutilizable, debería hacerlo como indica la respuesta en lugar de copiar/pasar el mismo código en cada acción. – Hades
Si configuro 'StatusCode = 500', entonces ignora mi JsonResponse y en su lugar devuelve" La página no se puede mostrar porque se ha producido un error interno del servidor ". No estoy seguro si esto se debe a una diferencia en la tubería OWIN o qué. – AaronLS