2009-04-10 6 views
5

Ich bin mit einem Filter Ausnahme von Aktionen geworfen zu protokollieren, die wie folgt aussehen:ASP.Net MVC - Wie behandelt man die Ausnahme in JSON-Aktion (JSON-Fehlerinfo zurückgeben), sondern auch die Ausnahme für Filter veröffentlichen?

public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     if (filterContext.Exception != null) 
     { 
      //logger.Error(xxx); 
     } 
     base.OnActionExecuted(filterContext); 
    } 

Jetzt würde ich meine JSON wie alle Aktionen verarbeiten JSON Ergebnis mit Ausnahmeinformationen zurückzukehren. Dies ermöglicht den Ajax-Aufrufen, festzustellen, ob ein Fehler auf dem Server aufgetreten ist, anstatt die Fehlerseite zu erhalten, was für Ajax nutzlos ist. Ich habe diese Methode für JSON Aktionen in meinem AppControllerBase implementiert:

public ActionResult JsonExceptionHandler(Func<object> action) 
    { 
     try 
     { 
      var res = action(); 
      return res == null ? JsonSuccess() : JsonSuccess(res); 
     } 
     catch(Exception exc) 
     { 
      return JsonFailure(new {errorMessage = exc.Message}); 
     } 
    } 

Dieses schöne funktioniert, aber offensichtlich der Fang() Anweisung verhindert alle Filter aus der Ausnahmebehandlung, denn es gibt keine Ausnahme tatsächlich geworfen ist. Gibt es eine Möglichkeit, Ausnahmen für Filter (filterContext.Exception) verfügbar zu machen?

Antwort

-1

Die Lösung:

Aktion

public ActionResult JsonExceptionHandler(Func<object> action) 
    { 
      try 
      { 
        var res = action(); 
        return res == null ? JsonSuccess() : JsonSuccess(res); 
      } 
      catch(Exception exc) 
      { 
        controller.ControllerContext.HttpContext.AddError(exc); 
        return JsonFailure(new {errorMessage = exc.Message}); 
      } 
    } 

Filter

public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
      var exception = filterContext.Exception ?? filterContext.HttpContext.Error; 
      if (exception != null) 
      { 
       //logger.Error(xxx); 
      } 

      if (filterContext.Result != null && 
       filterContext.HttpContext.Error != null) 
      { 
       filterContext.HttpContext.ClearError(); 
      } 

      base.OnActionExecuted(filterContext); 
    } 
+6

bitte veröffentlichen Sie Ihre JsonFailure && JsonSuccess – ari

1

Sie könnten die Ausnahme im RequestContext speichern und in Ihrem Filter abfangen.