6

Mi piacerebbe avere 1 pagina di errore che a seconda della stringa di query fornita visualizza un messaggio di errore leggermente diverso per l'utente.Confuso con la gestione degli errori in ASP.net 5 MVC 6

Ho notato il seguente codice nel file Startup.cs durante la creazione di un nuovo progetto asp.net 5.

if (env.IsDevelopment()) 
{ 
    app.UseBrowserLink(); 
    app.UseDeveloperExceptionPage(); 
} 
else 
{ 
    app.UseExceptionHandler("/Home/Error"); 
} 

Sono stato in grado di ottenere questo per visualizzare la pagina di errore corretta quando si verifica un'eccezione. Il mio problema è che sembra catturare solo errori che non sono stati gestiti nella mia applicazione, vale a dire sempre con un codice di stato di 500. È corretto?

Per gestire 404 errori Sto utilizzando il seguente codice:

app.UseStatusCodePagesWithReExecute("/Error/{0}"); 

Con il mio controller implementato come:

[HttpGet("{statusCode}")] 
public IActionResult Error(int statusCode) 
{ 
    return View(statusCode); 
} 

Questo sembra catturare i 404 errori e visualizza il codice di stato corretto.

Se aggiorno il mio codice in quanto sopra if per utilizzare la stessa azione, ad esempio:

if (env.IsDevelopment()) 
{ 
    app.UseBrowserLink(); 
    app.UseDeveloperExceptionPage(); 
} 
else 
{ 
    app.UseExceptionHandler("/Error/{0}"); 
} 

Il codice di stato restituito è sempre 0.

Inoltre che cosa accadrà quando un 400, 403 o in qualsiasi altro caso? Saranno catturati? Se sì, a che punto saranno catturati?

Come puoi dire sono molto confuso e mi piacerebbe che qualcuno mi fornisse un esempio in cui tutti i diversi codici di stato sono gestiti.

+0

Wont cattura l'errore globaly nell'evento Application_Error all'interno aiuto global.asax? http://stackoverflow.com/questions/16884074/asp-net-mvc-application-error-handler-in-global-asax –

+0

Che assomiglia ad asp.net MVC5? –

+0

Potete per favore pubblicare il codice di "UseExceptionHandler"? – Mairaj

risposta

18

Sembra che tu stia confondendo le eccezioni non gestite (che sono, di default, restituite al client come un errore del server interno HTTP 500) e casi di errore gestiti correttamente da azioni non valide per conto dell'utente/client (dove viene restituito un codice HTTP 4xx all'utente).

Solo il primo di questi ha a che fare con la chiamata UseExceptionHandler: per impostazione predefinita rileverà tutte le eccezioni non gestite e le indirizzerà a qualsiasi cosa tu fornisca (nel tuo caso, una vista, ma potrebbe altrettanto facilmente essere un pezzo di codice che ispeziona le eccezioni non gestite per convertire determinati casi di errore in codici di ritorno HTTP 4xx, ad esempio errori di autenticazione nelle risposte HTTP 401).

UseStatusCodePagesWithReExecute entrerà nel punto in cui è stato generato un codice di stato di 400-599, purché non sia già stato generato alcun corpo di risposta. Il source code in question mostra come questo è determinato.

Nel secondo blocco di codice, hai utilizzato UseExceptionHandler - penso che si dovrebbe avere la seguente:

if (env.IsDevelopment()) 
{ 
    app.UseBrowserLink(); 
    app.UseDeveloperExceptionPage(); 
} 
else 
{ 
    // Handle unhandled errors 
    app.UseExceptionHandler("/Home/Error"); 
    // Display friendly error pages for any non-success case 
    // This will handle any situation where a status code is >= 400 
    // and < 600, so long as no response body has already been 
    // generated. 
    app.UseStatusCodePagesWithReExecute("/Error/{0}"); 
} 
+0

OK, la maggior parte di ciò che hai detto ha senso. La mia unica query è che tipo di codice di errore sarà questa riga di codice: app.UseStatusCodePagesWithReExecute ("/ Error/{0}"); prendere oltre 404? –

+2

Ecco [la risposta definitiva] (https://github.com/aspnet/Diagnostics/blob/dev/src/Microsoft.AspNetCore.Diagnostics/StatusCodePage/StatusCodePagesMiddleware.cs#L42) su quello - tutto ciò che ha un codice di stato da 400 a 600 inclusi, dove nessun corpo di risposta è già stato generato, verrà gestito da UseStatusCodePages. Aggiornerò la risposta per riflettere questo –

+0

Una risposta precisa a @MarkHughes – Drakoumel