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 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. –
+1 Auch, danke für das Heads-up von TrySkipIisCustomErrors, das hat mir auch sehr geholfen. – Schmuli