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 Graham per avermi introdotto TrySkipIisCustomErrors. Ho trovato la tua domanda durante una ricerca disperata e sono contento di averlo fatto. –
+1 Anche, grazie per l'heads-up su TrySkipIisCustomErrors, anche quello mi ha aiutato molto. – Schmuli