2014-12-23 13 views
10

ASP.Net MVC 5 6, come uso comune Error.cshtml come la risposta di errore predefinitoASP.Net MVC 5 6, come utilizzare Error.cshtml condivisa come risposta di errore predefinito

quando si utilizza Microsoft. AspNet.Diagnostics UseExceptionHandler middleware con vista rasoio

Se si guarda il codice di esempio a https://github.com/aspnet/Diagnostics/tree/dev/samples/ExceptionHandlerSample/Startup.cs explaning come utilizzare Microsoft.AspNet.Diagnostics ErrorHandler middleware per ASP.Net 5, un commento dire:

// N normalmente useresti MVC o simili per rendere una bella pagina.

Ok, ma come farlo?

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

è possibile utilizzare app.UseExceptionHandler con la pagina di errore predefinita? Voglio catturare i dettagli dell'errore, ma mantenere il comportamento e le pagine esistenti. –

risposta

21

in classe di avvio:

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

in HomeController:

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

la vista Error.cshtml può apparire come:

@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) 
} 

questo codice fa parte del progetto disponibile su GitHub

+0

Sfortunatamente non sembra funzionare - almeno non usando IIS Express con VS2015. Ricevo ancora il messaggio di errore predefinito. "Errore HTTP 404.0 - Non trovato La risorsa che stai cercando è stata rimossa, ha cambiato nome o è temporaneamente non disponibile." ' –

+0

Non l'ho ripetuto con beta4 –

+0

@Soulhuntre Il gestore degli errori gestisce l'eccezione non elaborata , non 404, è necessario creare il proprio middleware o utilizzare le impostazioni di iss per personalizzare la pagina 404 –

6

Per gestire 404s e errori interni è necessario modificare la firma dell'errore.

Ho commentato esplicitamente i gestori degli errori di debug nel mio ambiente Dev in Startup.cs. Se non vuoi farlo usa la variabile di ambiente nel progetto.

Aggiungere questo al 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}"); 

Aggiungere questo ai HomeController.cs

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

Grande! 'app.UseStatusCodePagesWithReExecute ("/Home/Errore/{0} ");' è quello che mi serviva –

+0

Grazie mille Chris, hai reso la mia giornata! –

Problemi correlati