wake-up-neo.com

ASP.NET MVC 5-Fehlerbehandlung

Wir wollen 403 Fehler, 404 Fehler, alle Fehler aufgrund eines MySpecialDomainException behandeln und eine Standardfehlerseite für alle anderen Fehler bereitstellen (einschließlich Fehler in der IIS Konfiguration!). Alle Fehler sollten die richtigen Razor-Ansichten zurückgeben. Es wäre sehr schön, ein ErrorController vor den Ansichten zu haben. ZB ungefähr so:

public class ErrorController : Controller
{
    public ViewResult NotFound () { return View(); }
    public ViewResult Forbidden () { return View(); }
    public ViewResult Default ()
    {
        var ex = ObtainExceptionFromSomewhere();
        if(ex is MySpecialDomainException)
            return View("MySpecialDomainException", new ErrorModel { Exception = ex });

        return View("GeneralError", new ErrorModel { Exception = ex });
    }
}

Derzeit finden Sie im Internet viele verschiedene Möglichkeiten, um dies zu tun, von denen einige höchstwahrscheinlich veraltet sind. Unter diesen:

  • Controller.OnException ()
  • Fehlerfilter
  • customErrors-Element in web.config
  • Behandlung im Application_Error von Global.asax

Q1: Wie können wir unsere Anforderungen mit ASP.NET MVC 5 erfüllen?

Wir möchten auch Fehler auffangen, die im IIS= Host auftreten. Q2: Um dies zu verhindern, müssen IIS alle 404-Werte verarbeiten, die wir angenommen haben Informationen zum Hinzufügen einer Standardroute, die allen möglichen URLs entspricht - ist dies empfehlenswert? Besser, Sie registrieren sich stattdessen auch für IIS 404s?

Q3: Ist es überhaupt möglich, eine IIS Fehlerseite zu registrieren, die auf einen Controller zurückgeht, oder ist IIS fähig zu ASPX?/nur statisches HTML?

38
D.R.

Der beste Weg ist die Verwendung von Global.Asax, da Sie alle Arten von Fehlern (Ajax-Aufrufe/alle unerwarteten Fehler) verwalten können. mit anderen kann man das nicht machen.

So was:

protected void Application_Error()
{
    HttpContext httpContext = HttpContext.Current;
    if (httpContext != null)
    {
        RequestContext requestContext = ((MvcHandler)httpContext.CurrentHandler).RequestContext;
        /* When the request is ajax the system can automatically handle a mistake with a JSON response. 
           Then overwrites the default response */
        if (requestContext.HttpContext.Request.IsAjaxRequest())
        {
            httpContext.Response.Clear();
            string controllerName = requestContext.RouteData.GetRequiredString("controller");
            IControllerFactory factory = ControllerBuilder.Current.GetControllerFactory();
            IController controller = factory.CreateController(requestContext, controllerName);
            ControllerContext controllerContext = new ControllerContext(requestContext, (ControllerBase)controller);

            JsonResult jsonResult = new JsonResult
            {
                Data = new { success = false, serverError = "500" },
                JsonRequestBehavior = JsonRequestBehavior.AllowGet
            };
            jsonResult.ExecuteResult(controllerContext);
            httpContext.Response.End();
        }
        else
        {
            httpContext.Response.Redirect("~/Error");
        }
    }
}
50
natnael88

Es gibt keine goldene Lösung für alle Anwendungen.

Sie können eine benutzerfreundliche Fehlerseite anzeigen, indem Sie httpErrors in web.config verwenden. Im Gegensatz zu customErrors ist dies eine IIS Ebeneneinstellung und zeigt Ihnen sogar eine benutzerfreundliche Fehlerseite für Fehler an, die nicht in ASP.NET enthalten sind.

Für die Fehlerprotokollierung würde ich empfehlen, ein HttpModule wie ELMAH zu verwenden: https://code.google.com/p/elmah/

Ich habe einen ganzen Blog-Beitrag darüber geschrieben und die verschiedenen Möglichkeiten der Fehlerbehandlung erklärt: http://dusted.codes/demystifying-aspnet-mvc-5-error-pages-and-error-logging =

41
dustinmoris

Eine bessere Möglichkeit, Fehler zu behandeln, besteht darin, das Attribut handleerror zu erweitern. Das Fehlerbehandlungsattribut bietet die folgenden Vorteile

  • Mit HandleErrorAttribute erhalten wir mehr Kontrolle über die Ausnahmebehandlung. Mit HandleError können wir Fehler für verschiedene Controller und Aktionen auf einfache Weise unterschiedlich behandeln, wobei wir in Application_Error zum Abrufen dieser Funktion die Hilfe einer Switch-Schleife verwenden.

  • Sobald Sie sich in Application_Error befinden, haben Sie keine MVC mehr und verlieren ControllerContext. In diesem Fall können wir nicht viel tun, was mit HandleError problemlos möglich ist.

informationen zum Erweitern der Fehlerbehandlungsattribute und -vorteile finden Sie im folgenden Beitrag

Vorteile von [HandleError] gegenüber Application_Error

http://maheshde.blogspot.com.au/2012/09/error-handing-with-mvc-using-custom.html

http://www.codeproject.com/Articles/731913/Exception-Handling-in-MVC

7
Mahesh