2016-03-23 15 views
1

Ich habe ein bisschen Code, der die Fehlerbehandlung für mich durchführt, um abhängig vom empfangenen Fehler bestimmte Ansichten anzuzeigen.C# MVC Ermitteln des erfolgreichen HTTP-Statuscodes

Mein Code sieht wie folgt aus:

protected void Application_EndRequest() 
    { 
     var response = new HttpResponseMessage((HttpStatusCode)Context.Response.StatusCode); 
     if (!response.IsSuccessStatusCode) 
     { 
      var rd = new RouteData(); 
      IController c = new ErrorController(); 
      switch (response.StatusCode) 
      { 
       case HttpStatusCode.BadRequest: 
        Response.Clear(); 
        rd.Values["controller"] = "Error"; 
        rd.Values["action"] = "BadRequest"; 
        c.Execute(new RequestContext(new HttpContextWrapper(Context), rd)); 
        break; 
       case HttpStatusCode.NotFound: 
        Response.Clear(); 
        rd.Values["controller"] = "Error"; 
        rd.Values["action"] = "NotFound"; 
        c.Execute(new RequestContext(new HttpContextWrapper(Context), rd)); 
        break; 
       case HttpStatusCode.InternalServerError: 
        Response.Clear(); 
        rd.Values["controller"] = "Error"; 
        rd.Values["action"] = "InternalServerError"; 
        c.Execute(new RequestContext(new HttpContextWrapper(Context), rd)); 
        break; 
       case HttpStatusCode.Forbidden: 
        Response.Clear(); 
        rd.Values["controller"] = "Error"; 
        rd.Values["action"] = "Forbidden"; 
        c.Execute(new RequestContext(new HttpContextWrapper(Context), rd)); 
        break; 
       default: 
        Response.Clear(); 
        rd.Values["controller"] = "Error"; 
        rd.Values["action"] = "GenericError"; 
        c.Execute(new RequestContext(new HttpContextWrapper(Context), rd)); 
        break; 
      } 
     } 

Dies funktioniert für Standard-HTTP-Statuscodes und wie in der Dokumentation definiert sind, und Antwortcode von 200-299 doesnt bekommen behandelt und durchläuft.

Allerdings ist meine Frage, ist dies der beste Weg, es zu tun?

Dies ergab sich aus einer meiner Anfragen mit einem Statuscode von 302 - Gefunden. Nun, nach der Dokumentation würde dies nicht als erfolgreicher Code klassifiziert werden, aber ich sehe nicht, wie es nicht als erfolgreich eingestuft werden kann.

Gibt es also einen besseren Weg, um alle erfolgreichen Codes als nur 200-299 zu berücksichtigen?

Vielen Dank für Ihre Anregungen und Meinungen. Ich verstehe, dass es keine absolute Antwort darauf geben kann.

Putting 1 Vorschlag da draußen wäre, die if-Anweisung zu ändern:

if(!(statuscode >= 400 && statuscode <= 599) 

Dies liegt daran, 4xx-Codes als Client Fehler und 5xx-Codes definiert sind, werden als Server-Fehler definiert. Deshalb sollte es sie alle fangen ??

Aber was ist mit dem gefürchteten 418 zu tun? :)

EDIT

habe ich versucht, mit httperrors:

<httpErrors errorMode="Custom" existingResponse="Replace"> 
    <clear/> 
    <error path="/Error/NotFound" responseMode="ExecuteURL" statusCode="400"/> 
</httpErrors> 

Neben custom in web.config:

<customErrors mode="On" defaultRedirect="~/Error"> 
    <error statusCode="404" redirect="~/Error/NotFound" /> 
    <error statusCode="403" redirect="~/Error/Forbidden" /> 
    <error statusCode="500" redirect="~/Error/InternalServerError" />   
</customErrors> 

Beide ohne Glück

+0

Sie wissen, dass Sie dies einfach tun [in web.config] (http://benfoster.io/blog/aspnet-mvc-custom-error-pages)? – Smudge202

+0

Verwenden Sie IIS7 +? Wenn ja, versuchen Sie nur mit httpErrors zu arbeiten. – Chris

+0

Ich habe sie separat ausprobiert. Ich glaube, dass ich eine frühere Version von iis – DaRoGa

Antwort

1

Sie müssen nicht unbedingt alles Error abdecken R-Codes (von 400 bis 500).

Werfen Sie einen Blick auf: Which HTTP Status Codes to cover for MVC error handling

Und es ist besser, die Handler bereits in der Pipeline zu verwenden, anstatt das, was Sie in Application_EndRequest() tun. Was ich damit meine ist, dass Sie die <httpErrors ... und/oder <customErrors in der web.config verwenden sollten.

<httpErrors> konfiguriert IIS, während <customErrors> ASP konfiguriert.NET Quelle: How to add a default error page using httpErrors

Beispiel: How can I properly handle 404 in ASP.NET MVC?

Ein weiterer großer Artikel: Demystifying ASP.NET MVC 5 Error Pages and Error Logging

Dieser Artikel ausführlich erklärt, wie man richtig Setup 404 und 500: Custom error pages in ASP.NET MVC. Easy, right?

+0

verwenden muss Könnten Sie bitte weiter erklären. Ich habe versucht, CustomErrors vorher zu benutzen und konnte es nicht funktionieren deshalb ich ging mit diesem Ansatz – DaRoGa

+0

Ich habe meine Antwort bearbeitet, vielleicht möchten Sie ein wenig googeln, es ist eine häufige Frage. – Chris

+0

siehe meine Bearbeitung – DaRoGa

1

Nun, ich bin nicht sicher die Fehlercodes, aber Sie sollten Code nicht kopieren und einfügen.

Stellen Sie stattdessen eine Funktion ein.

protected void Application_EndRequest() 
{ 
    var response = new HttpResponseMessage((HttpStatusCode)Context.Response.StatusCode); 

    if (!response.IsSuccessStatusCode) 
    { 
     switch (response.StatusCode) 
     { 
      case HttpStatusCode.BadRequest: 
       ErrorAction("BadRequest"); 
       break; 
      case HttpStatusCode.NotFound: 
       ErrorAction("NotFound"); 
       break; 
      case HttpStatusCode.InternalServerError: 
       ErrorAction("InternalServerError"); 
       break; 
      case HttpStatusCode.Forbidden: 
       ErrorAction("Forbidden"); 
       break; 
      default: 
       ErrorAction("GenericError"); 
       break; 
     } 
    } 
} 

// Sends a request to the ErrorController 
private void ErrorAction(string action) 
{ 
    var rd = new RouteData(); 
    IController c = new ErrorController(); 

    Response.Clear(); 

    rd.Values["controller"] = "Error"; 
    rd.Values["action"] = action; 

    c.Execute(new RequestContext(new HttpContextWrapper(Context), rd)); 
} 

Dieser Code schlägt vor, dass Sie die verschiedenen Aktionen Errorcontroller zusammen beseitigen konnte, und übergeben Sie einfach den Statuscode in der Abfrage-String in einer einzigen Aktion Methode.

+0

Ich stimme zu, der Code ist nicht raffiniert und muss gereinigt werden, um den duplizierten Code zu vermeiden, es war rein, wie ich hatte keine Chance, dies zu tun und wollte Gedanken bekommen. Ich werde umgestalten, wie Sie vorgeschlagen haben, wie ich diesen Ansatz mag. Aber glauben Sie, dass dies eine geeignete Lösung für diese Aufgabe ist oder gibt es eine bessere/verfeinerte Methode? – DaRoGa

+0

Wie @ Chris in einer anderen Antwort sagt, müssen Sie diesen Code nicht schreiben. MVC behandelt Fehler in der web.config. Siehe http://stackoverflow.com/questions/717628/asp-net-mvc-404-error-handling – buffjape

+0

PS. Versuchen Sie zu vermeiden, Code zu schreiben, der aufgeräumt werden muss. :-) – buffjape