En resumen, el camino a seguir puede ser la de ampliar el HandleErrorAttribute, así:
public class OncHandleErrorAttribute : HandleErrorAttribute
{
public override void OnException(ExceptionContext context)
{
// Elmah-Log only handled exceptions
if (context.ExceptionHandled)
ErrorSignal.FromCurrentContext().Raise(context.Exception);
if (context.HttpContext.Request.IsAjaxRequest())
{
// if request was an Ajax request, respond with json with Error field
var jsonResult = new ErrorController { ControllerContext = context }.GetJsonError(context.Exception);
jsonResult.ExecuteResult(context);
context.ExceptionHandled = true;
}
else
{
// if not an ajax request, continue with logic implemented by MVC -> html error page
base.OnException(context);
}
}
}
Retire Elmah línea de código de registro si no lo necesita. Uso uno de mis controladores para devolver un json basado en un error y contexto. Aquí está la muestra:
public class ErrorController : Controller
{
public ActionResult GetJsonError(Exception ex)
{
var ticketId = Guid.NewGuid(); // Lets issue a ticket to show the user and have in the log
Request.ServerVariables["TTicketID"] = ticketId.ToString(); // Elmah will show this in a nice table
ErrorSignal.FromCurrentContext().Raise(ex); //ELMAH Signaling
ex.Data.Add("TTicketID", ticketId.ToString()); // Trying to see where this one gets in Elmah
return Json(new { Error = String.Format("Support ticket: {0}\r\n Error: {1}", ticketId, ex.ToString()) }, JsonRequestBehavior.AllowGet);
}
Agrego información sobre el ticket anterior, puede ignorar esto. Debido a la forma en que se implementa el filtro (extiende los HandleErrorAttributes por defecto) entonces podemos eliminar HandleErrorAttribute de los filtros globales:
public class MvcApplication : System.Web.HttpApplication
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new GlobalAuthorise());
filters.Add(new OncHandleErrorAttribute());
//filters.Add(new HandleErrorAttribute());
}
Esta es básicamente la misma. Puede leer my blog entry para obtener información más detallada, pero para la idea, lo anterior debería ser suficiente.
Lo he intentado pero cuando se llama al método HandleJsonErrorAttribute OnException, la propiedad filterContext.ExceptionHandled siempre es verdadera cuando hay un HandleErrorAttribute en la clase Controller a la que pertenece la acción. ¿No deberían los métodos de acción handleerror tener prioridad y ser llamados primero? –