Todo,manejo de excepciones en ASP.NET MVC y Ajax - [HandleException] filtrar
estoy aprendiendo MVC y usarlo para una aplicación de negocios (MVC 1.0).
Realmente estoy luchando para entender el manejo de excepciones. Pasé mucho tiempo en la web pero no encontré nada parecido a lo que busco.
Actualmente utilizamos un atributo de filtro que implementa IExceptionFilter. Decoramos una clase de controlador de base con esto, por lo que todas las excepciones del lado del servidor están encaminadas a una página de excepción que muestra el error y realiza el registro.
Comencé a usar llamadas AJAX que devuelven datos JSON, pero cuando la implementación del lado servidor arroja un error, el filtro se activa pero la página no se redirige a la página Error, solo permanece en la página que llamó Método AJAX.
¿Hay alguna manera de forzar la redirección en el servidor (por ejemplo, un ASP.NET Server.Transfer o redirigir?)
He leído que debo devolver un objeto JSON (envolviendo el .NET Exception) y luego redireccionar al cliente, pero luego no puedo garantizar que el cliente redireccione ... pero luego (aunque probablemente estoy haciendo algo mal) el servidor intenta redirigir pero luego recibe una excepción no autorizada (el controlador base está asegurado pero el controlador de excepción no es el que no hereda de este)
Alguien ha obtenido un ejemplo simple (código .NET y jQuery). Siento que estoy tratando azar cosas con la esperanza de que va a funcionar
Excepción filtro hasta el momento ...
public class HandleExceptionAttribute : FilterAttribute, IExceptionFilter
{
#region IExceptionFilter Members
public void OnException(ExceptionContext filterContext)
{
if (filterContext.ExceptionHandled)
{
return;
}
filterContext.Controller.TempData[CommonLookup.ExceptionObject] = filterContext.Exception;
if (filterContext.HttpContext.Request.IsAjaxRequest())
{
filterContext.Result = AjaxException(filterContext.Exception.Message, filterContext);
}
else
{
//Redirect to global handler
filterContext.Result = new RedirectToRouteResult(new RouteValueDictionary(new { controller = AvailableControllers.Exception, action = AvailableActions.HandleException }));
filterContext.ExceptionHandled = true;
filterContext.HttpContext.Response.Clear();
}
}
#endregion
private JsonResult AjaxException(string message, ExceptionContext filterContext)
{
if (string.IsNullOrEmpty(message))
{
message = "Server error"; //TODO: Replace with better message
}
filterContext.HttpContext.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
filterContext.HttpContext.Response.TrySkipIisCustomErrors = true; //Needed for IIS7.0
return new JsonResult
{
Data = new { ErrorMessage = message },
ContentEncoding = Encoding.UTF8,
};
}
}
+1 Graham por presentarme TrySkipIisCustomErrors. Encontré tu pregunta durante una búsqueda desesperada y estoy contento de haberlo hecho. –
+1 También, gracias por el heads-up en TrySkipIisCustomErrors, eso realmente me ayudó también. – Schmuli