2015-06-11 9 views
11

ich verschiedene Fehlermeldungen für jeden Statuscode zB angezeigt werden soll:ASP.NET MVC 6 Handlingfehler basierend auf HTTP-Statuscode

  • 400 Bad Request
  • 403 Forbidden
  • 500 Internal Server Error
  • 404 Not Found
  • 401 Unauthorized

Wie kann Ich erreiche dies in den neuen ASP.NET MVC 6 Anwendungen? Kann ich dies mithilfe der integrierten UseErrorHandler-Methode tun?

Auch bemerkte ich, dass sogar mit dem obigen Handler, Eingabe einer nicht vorhandenen URL, z./this-page-does-not-exist, verursacht eine hässliche 404 Not Found-Fehlerseite von IIS. Wie kann dies auch gehandhabt werden? den system.web custom Abschnitt für ASP.NET verwenden und den system.webServer httperrors Abschnitt in der Datei web.config

In MVC 5 hatten wir aber es war schwierig, mit einer unhandlich zu arbeiten, mit vielen sehr seltsames Verhalten. Macht MVC 6 das viel einfacher?

Antwort

11

Sie könnten hierfür die StatusCodePagesMiddleware verwenden. Es folgt ein Beispiel:

public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) 
{ 
    app.UseStatusCodePagesWithReExecute("/StatusCodes/StatusCode{0}"); 

    app.UseMvcWithDefaultRoute(); 

Steuerung, die den Statuscode-Anforderungen verarbeitet:

public class StatusCodesController : Controller 
{ 
    public IActionResult StatusCode404() 
    { 
     return View(viewName: "NotFound"); // you have a view called NotFound.cshtml 
    } 

    ... more actions here to handle other status codes 
} 

Einige Anmerkungen:

  • prüfen andere Erweiterungsmethoden wie UseStatusCodePagesWithRedirects und UseStatusCodePages für andere Funktionen.
  • Ich habe versucht, StatusCode als Abfragezeichenfolge in meinem Beispiel, aber sieht so aus Middleware verarbeitet Abfragezeichenfolgen nicht, aber Sie können einen Blick auf this Code und beheben Sie dieses Problem.
+1

Hinweis: Dies ist eine bessere Lösung als die unten angegebene. –

+0

Dieser Code wird für alle Anfragen ausgeführt. Habe ich recht, wenn ich sage, dass dies dem Action-Delegaten hinzugefügt wird, der an UseErrorHandler übergeben werden kann? –

+1

@RehanSaeed: Ja, dies könnte für alle Anfragen ausgeführt werden, da es die Antworten abfangen muss, um den Statuscode zu überprüfen. Ihre zweite Frage ist mir nicht klar. Dies ist eine andere Middleware als der 'UserErrorHandler'. Kannst du mehr ausarbeiten? –

3

Wie kann ich dies in den neuen ASP.NET MVC 6-Anwendungen erreichen? Kann ich dies mithilfe der integrierten UseErrorHandler-Methode tun?

Schnell Antwort: Nicht in einer eleganten Art und Weise.

Erklärung/Alternative: Um lässt auf den ersten Blick zu starten, was die UseErrorHandler Methode tatsächlich tut: https://github.com/aspnet/Diagnostics/blob/6dbbe831c493e6e7259de81f83a04d1654170137/src/Microsoft.AspNet.Diagnostics/ErrorHandlerExtensions.cs#L25, die folgende Middleware ergänzt: https://github.com/aspnet/Diagnostics/blob/6dbbe831c493e6e7259de81f83a04d1654170137/src/Microsoft.AspNet.Diagnostics/ErrorHandlerMiddleware.csHinweis Zeilen 29-78 (die Methode invoke)

Die invoke Die Methode wird ausgeführt, sobald eine Anfrage eingeht (gesteuert durch den Standort Ihrer application.UseErrorHandler("...") in Ihrer Startup.cs). So ist die UseErrorHandler eine bessere Möglichkeit, eine benutzerdefinierte Middleware hinzuzufügen: Middleware = Komponente, die auf eine http-Anfrage einwirken kann.

Jetzt mit diesem Hintergrund, wenn wir unsere eigene Fehler-Middleware hinzufügen wollten, differenzierte Anfragen. Wir könnten dies tun, indem wir eine ähnliche Middleware hinzufügen, die wie der Standard ErrorHandlerMiddleware ist, indem wir diese Zeilen ändern: https://github.com/aspnet/Diagnostics/blob/6dbbe831c493e6e7259de81f83a04d1654170137/src/Microsoft.AspNet.Diagnostics/ErrorHandlerMiddleware.cs#L48-L51 Mit diesem Ansatz könnten wir den Umleitungsweg basierend auf dem Statuscode steuern.

In MVC 5 haben wir den system.web custom Abschnitt für ASP.NET und den system.webServer httperrors Abschnitt in der Datei web.config verwenden mussten, aber es war schwierig, mit einer unhandlich zu arbeiten, mit vielen sehr seltsames Verhalten. Macht MVC 6 das viel einfacher?

Antwort: Es ist sicher :). Genau wie die obige Antwort liegt das Problem darin, Middleware hinzuzufügen.Es gibt eine Verknüpfung zum Hinzufügen einfacher Middleware über die IApplicationBuilder in Ihrem Startup.cs; am Ende Ihrer Configure Methode können Sie fügen Sie folgendes:

app.Run(async (context) => 
{ 
    await context.Response.WriteAsync("Could not handle the request."); 

    // Nothing else will run after this middleware. 
}); 

Dies funktioniert, weil es bedeutet, dass Sie das Ende Ihrer http Pipeline ohne die Anfrage bearbeitet wird erreicht (da es am Ende Ihrer Configure Methode ist in Startup.cs). Wenn Sie diese Middleware hinzufügen möchten (in der schnellen Mode) mit der Option, Middleware, nachdem Sie auszuführen, gehen Sie wie folgt:

app.Use(async (context, next) => 
{ 
    await context.Response.WriteAsync("Could not handle the request."); 

    // This ensures that any other middelware added after you runs. 
    await next(); 
}); 

hoffe, das hilft!

+0

Vermutlich ist dies ein Ersatz für den Custom Abschnitt von web.config nur und würde nicht funktionieren für 404 nicht gefundene Fehler. Dazu müssten wir noch httpErrors verwenden? –

+1

Dies würde auch für 404 nicht gefundene Fehler funktionieren. Ein 404 tritt auf, wenn nichts die Anfrage verarbeiten kann. –

0

Funktioniert mit verschiedenen Statuscodes, ohne jede einzeln im Controller anzugeben.

Startup.cs:

public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory) 
{ 
    app.UseStatusCodePagesWithRedirects("/StatusCodes?statusCode={0}"); 
    app.UseMvcWithDefaultRoute(); 

Controller:

public class StatusCodesController : Controller 
    { 
    public IActionResult Index(string statusCode) 
    { 
     if(statusCode == null) statusCode = ""; 
     if(statusCode == "404") return View("Error404"); 
     return View("Index",statusCode); 
    } 

    public IActionResult Test404() { return StatusCode(404); } 
    public IActionResult Test500() { return StatusCode(500); } 

Ausblick:

@model string 
@{ ViewData["Title"] = Model + " Oops!"; } 

<style> 
    .error-template { 
    padding: 40px 15px; 
    text-align: center; 
    } 

    .error-actions { 
    margin-bottom: 15px; 
    margin-top: 15px; 
    } 

    .error-actions .btn { 
     margin-right: 10px; 
    } 
</style> 

<div class="container"> 
    <div class="row"> 
    <div class="col-md-12"> 
     <div class="error-template"> 
     <h2>Oops!</h2> 
     <h2>@Model Error</h2> 
     <div class="error-details">Sorry, an error has occurred!</div> 
     <div class="error-actions"> 
      <a class="btn btn-primary btn-lg" href="/"><span class="glyphicon glyphicon-home"></span> Take Me Home </a> 
      <a class="btn btn-default btn-lg" href="/Home/ContactUs"><span class="glyphicon glyphicon-envelope"></span> Contact Support </a> 
     </div> 
     </div> 
    </div> 
    </div> 
</div> 
Verwandte Themen