2010-04-03 1 views
7

Tutti,Gestione delle eccezioni in ASP.NET MVC e Ajax - [HandleException] Filtro

sto imparando MVC e di utilizzarlo per un'applicazione commerciale (MVC 1.0).

Sto davvero cercando di capire come gestire le eccezioni. Ho trascorso molto tempo sul web ma non ho trovato nulla sulla falsariga di quello che sto cercando.

Attualmente utilizziamo un attributo di filtro che implementa IExceptionFilter. Decoriamo una classe di controller di base con questo in modo che tutte le eccezioni lato server siano correttamente indirizzate a una pagina delle eccezioni che visualizza l'errore ed esegue la registrazione.

Ho iniziato a utilizzare le chiamate AJAX che restituiscono dati JSON ma quando l'implementazione lato server genera un errore, il filtro viene attivato ma la pagina non reindirizza alla pagina Errore - rimane semplicemente sulla pagina che ha chiamato il Metodo AJAX.

C'è un modo per forzare il reindirizzamento sul server (ad esempio un ASP.NET server.Transfer o reindirizzare?)

Ho letto che io devo restituire un oggetto JSON (avvolgendo il .NET Eccezione) e poi reindirizzare sul client, ma non posso garantire che il client reindirizzerà ... ma poi (anche se probabilmente sto facendo qualcosa di sbagliato) il server tenta di reindirizzare, ma poi ottiene un'eccezione non autorizzata (il controller di base è protetto ma il controller Exception non è così come non eredita da questo)

Qualcuno per favore ha un semplice esempio (codice .NET e jQuery). Mi sento come se stessi in modo casuale provare cose nella speranza che funzionerà

Eccezione filtro finora ...

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 per avermi introdotto TrySkipIisCustomErrors. Ho trovato la tua domanda durante una ricerca disperata e sono contento di averlo fatto. –

+0

+1 Anche, grazie per l'heads-up su TrySkipIisCustomErrors, anche quello mi ha aiutato molto. – Schmuli

risposta

2

uso il hanlder OnFailure in Ajax.Beginform(). Il gestore degli errori lato client può reindirizzare impostando window.location (tra una serie di altre opzioni). Funzionerà nel 99% dei browser moderni, se il browser supporta AJAX dovrebbe supportare questo.