2010-04-03 12 views
7

Alle,Ausnahmebehandlung in ASP.NET MVC und Ajax - [Handle] filtern

ich MVC lerne und es für ein Business-App (MVC 1.0) verwenden.

bin zu kämpfen ich wirklich meinen Kopf um die Ausnahmebehandlung zu erhalten. Ich habe viel Zeit im Internet verbracht, aber nichts in der Art gefunden, wonach ich suche.

Wir verwenden derzeit ein Filter-Attribut, das IExceptionFilter implementiert. Wir dekorieren eine Basis-Controller-Klasse so, dass alle serverseitigen Ausnahmen auf eine Ausnahmeseite weitergeleitet werden, die den Fehler anzeigt und die Protokollierung durchführt.

Ich habe begonnen, AJAX-Aufrufe zu verwenden, die JSON-Daten zurückgeben, aber wenn die serverseitige Implementierung einen Fehler auslöst, wird der Filter ausgelöst, aber die Seite wird nicht auf die Seite Error weitergeleitet - sie bleibt nur auf der Seite AJAX-Methode.

Gibt es eine Möglichkeit die Umleitung auf dem Server zu erzwingen (zB eine ASP.NET Server.Transfer oder umleiten?)

Ich habe gelesen, dass ich muss ein JSON-Objekt zurück (Einwickeln des .NET Exception) und dann auf dem Client zu umleiten, aber dann kann ich nicht garantieren, wird die Client umleiten ... aber dann (obwohl ich wahrscheinlich etwas falsch) der Server zu umleiten tun bin versucht, aber dann wird eine nicht autorisierte Ausnahme (die Basis-Controller gesichert wird, aber der Exception-Controller ist nicht, wie es aus dieser erbt nicht)

jemanden hat bekam bitte ein einfaches Beispiel (.NET und jQuery-Code). Ich fühle mich wie ich bin zufällig Dinge in der Hoffnung, versuchen, wird es so weit ...

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 für mich TrySkipIisCustomErrors einzuführen. Ich habe Ihre Frage bei einer verzweifelten Suche gefunden und ich bin froh, dass ich es getan habe. –

+0

+1 Auch, danke für das Heads-up von TrySkipIisCustomErrors, das hat mir auch sehr geholfen. – Schmuli

Antwort

2

I

Exception Filter arbeiten verwenden, um die OnFailure hanlder in Ajax.Beginform(). Der clientseitige Ausfall-Handler kann durch Einstellung window.location umleiten (unter einer Reihe von anderen Optionen.) Dies wird in 99% des modernen browsers- funktionieren, wenn der Browser unterstützt AJAX soll dies unterstützen.