7 Stimmen

ASP.Net MVC - wie man Ausnahme in JSON-Aktion behandeln (JSON-Fehlerinformationen zurückgeben), aber auch die Ausnahme für Filter veröffentlichen?

Ich verwende einen Filter, um Ausnahmen zu protokollieren, die durch Aktionen ausgelöst werden, die wie folgt aussehen:

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

Jetzt möchte ich alle meine JSON-Aktionen behandeln, um JSON-Ergebnisse mit Ausnahmeinformationen zurückzugeben. Dies ermöglicht die Ajax-Aufrufe, um festzustellen, ob es einen Fehler auf dem Server anstelle des Empfangs der Fehlerseite Quelle, die nutzlos für Ajax ist. Ich habe diese Methode für JSON-Aktionen in meiner 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
    });
  }
}

Das funktioniert gut, aber natürlich verhindert die catch()-Anweisung, dass alle Filter die Ausnahme behandeln, da eigentlich keine Ausnahme ausgelöst wird. Gibt es eine Möglichkeit, wie die Ausnahme für Filter (filterContext.Exception) verfügbar zu lassen?

1voto

Kris Punkte 6068

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

0voto

Buthrakaur Punkte 1825

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);
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X