2010-04-03 35 views
7

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

+1 Graham por presentarme TrySkipIisCustomErrors. Encontré tu pregunta durante una búsqueda desesperada y estoy contento de haberlo hecho. –

+0

+1 También, gracias por el heads-up en TrySkipIisCustomErrors, eso realmente me ayudó también. – Schmuli

Respuesta

2

utilizo el hanlder onFailure en Ajax.Beginform(). El manejador de fallas del lado del cliente puede redirigir configurando window.location (entre varias otras opciones). Esto funcionará en el 99% de los buscadores modernos: si el navegador admite AJAX, debería ser compatible con esto.