2014-12-23 7 views
10

ASP.Net MVC 5 6, geteilt zu verwenden, wie Error.cshtml Antwort als StandardfehlerASP.Net MVC 5 6, wie Error.cshtml Antwort als Standardfehler

bei der Verwendung von Microsoft Shared verwenden. AspNet.Diagnostics UseExceptionHandler Middleware mit einem Rasiermesser Blick

Wenn Sie bei https://github.com/aspnet/Diagnostics/tree/dev/samples/ExceptionHandlerSample/Startup.cs auf dem Beispielcode sehen explaning wie für ASP.Net 5 Microsoft.AspNet.Diagnostics Fehlerbehandler Middleware zu verwenden, ein Kommentar sagen:

// N Normalerweise würden Sie MVC oder ähnliches verwenden, um eine schöne Seite zu rendern.

Ok, aber wie geht das?

public class Startup 
{ 
    public void Configure(IApplicationBuilder app) 
    { 
     // Configure the error handler to show an error page. 
     app.UseExceptionHandler(errorApp => 
     { 
      // Normally you'd use MVC or similar to render a nice page. 
      errorApp.Run(async context => 
      { 
+0

den HomeController.cs hinzufügen ist es möglich, app.UseExceptionHandler mit Standardfehlerseite zu benutzen? Ich möchte Fehlerdetails erfassen, aber bestehendes Verhalten und Seiten beibehalten. –

Antwort

21

in Startklasse:

app.UseExceptionHandler("/Home/Error"); 

in Homecontroller:

public IActionResult Error() 
{ 
    var feature = this.HttpContext.Features.Get<IExceptionHandlerFeature>(); 
    return View("~/Views/Shared/Error.cshtml", feature?.Error); 
} 

die Error.cshtml Ansicht kann wie folgt aussehen:

@model Exception 

@{ 
    ViewBag.Title = "Oops!"; 
} 
<h1 class="text-danger">Oops! an error occurs</h1> 
<h2 class="text-danger">An error occurred while processing your request.</h2> 
@if (Model != null) 
{ 
    @Html.ValueFor(model => model.Message) 
} 

dieser Code ist Teil des Projekts verfügbar unter GitHub

+0

Leider scheint dies nicht zu funktionieren - zumindest nicht mit IIS Express mit VS2015. Ich bekomme immer noch die Standardfehlermeldung. '" HTTP-Fehler 404.0 - Nicht gefunden Die gesuchte Ressource wurde entfernt, der Name wurde geändert oder ist vorübergehend nicht verfügbar. "' –

+0

Ich habe es nicht erneut getestet mit beta4 –

+0

@Soulhuntre Error-Handler behandelt uncacted Ausnahme , nicht 404, Sie müssen Ihre eigene Middleware erstellen oder iss-Einstellungen verwenden, um 404 Seite –

6

Um 404s und interne Fehler behandeln zu können, müssen Sie die Fehlersignatur ändern.

Ich habe die Debugfehler-Handler in meiner Dev-Umgebung in der Startup.cs explizit auskommentiert. Wenn Sie dies nicht tun möchten, verwenden Sie die Umgebungsvariable im Projekt.

hinzufügen Zu den Startup.cs

if (env.IsDevelopment()) 
    { 
     // Uncomment when done testing error handling 
     //app.UseBrowserLink(); 
     //app.UseDeveloperExceptionPage(); 
     //app.UseDatabaseErrorPage(); 

     // Comment when done testing error handling 
     app.UseExceptionHandler("/Home/Error"); 
    } 
    else 
    { 
     app.UseExceptionHandler("/Home/Error"); 

     //For more details on creating database during deployment see http://go.microsoft.com/fwlink/?LinkID=615859 
     try 
     { 
      using (var serviceScope = app.ApplicationServices.GetRequiredService<IServiceScopeFactory>() 
       .CreateScope()) 
      { 
       serviceScope.ServiceProvider.GetService<ApplicationDbContext>() 
        .Database.Migrate(); 
      } 
     } 
     catch { } 
    } 


    // Lines Skipped For Brevity .... 


    // Add this line above app.Mvc in Startup.cs to Handle 404s etc 
    app.UseStatusCodePagesWithReExecute("/Home/Error/{0}"); 

diese

using Microsoft.AspNet.Mvc; 
    using Microsoft.AspNet.Diagnostics; 
    using Microsoft.AspNet.Http.Features; 

    // id = Http Status Error 
    public IActionResult Error(String id) 
    { 
     var feature = HttpContext.Features.Get<IExceptionHandlerFeature>(); 

     var undhandledException = feature?.Error; 
     var iisError = id; 

     return View(); 
    } 
+0

Großartig! 'app.UseStatusCodePagesWithReExecute ("/Home/Error/{0} ");' ist, was ich brauchte –

+0

Vielen Dank Chris, du hast meinen Tag gemacht! –