Prima di tutto, rapidamente ciò che voglio ottenere esattamente: traduci un'eccezione particolare nell'HTTP 404 in modo che ASP.NET possa gestirlo ulteriormente.Convertire un'eccezione nella risposta HTTP 404 in Application_Error
sto gestione delle eccezioni in ASP.NET (MVC2) in questo modo:
protected void Application_Error(object sender, EventArgs e) {
var err = Server.GetLastError();
if (err == null)
return;
err = err.GetBaseException();
var noObject = err as ObjectNotFoundException;
if (noObject != null)
HandleObjectNotFound();
var handled = noObject != null;
if (!handled)
Logger.Fatal("Unhandled exception has occured in application.", err);
}
private void HandleObjectNotFound() {
Server.ClearError();
Response.Clear();
// new HttpExcepton(404, "Not Found"); // Throw or not to throw?
Response.StatusCode = 404;
Response.StatusDescription = "Not Found";
Response.StatusDescription = "Not Found";
Response.Write("The whole HTML body explaining whata 404 is??");
}
Il problema è che non riesco a configurare di default customErrors
per lavorare con esso. Quando è on
, non reindirizza mai alla pagina specificata in customErrors
: <error statusCode="404" redirect="404.html"/>
.
Ho anche provato a sollevare new HttpExcepton(404, "Not Found")
dal gestore ma il codice di risposta è 200
che non capisco perché.
Quindi le domande sono:
- Qual è il modo corretto di tradurre
AnException
in HTTP404
risposta? - Come funziona la sezione
customErrors
quando si gestiscono le eccezioni in Application_Error? - Perché il lancio di HttpException (404) rende la pagina (vuota) con stato di successo (200)?
Grazie,
Dmitriy.
'È meglio gestire le eccezioni in Controller' - forse, ma non catturerà l'eccezione Non-Mvc, di cui ho bisogno. 'deriva la tua eccezione ObjectNotFoundException da HttpException' - non è possibile, è l'eccezione dal livello dati e non ha nulla a che fare con HTTP. 'È possibile impostare manualmente il codice di stato e scrivere sulla risposta '- in questo caso la configurazione' CustomErrors' non verrà avviata. ' reindirizza manualmente il reindirizzamento alla pagina di errore personalizzata '- perché diavolo quindi abbiamo '* personalizzato * Sezione degli errori. Una cosa così semplice, ma così tanti ostacoli, - basta kick-in customError handler su una determinata eccezione. –
Dmitriy, sono d'accordo con te sul fatto che cambierà Server.GetLastError in Application_Error. Ma l'attuale API ASP.Net non consente di farlo. "ma non catturerà l'eccezione Non-Mvc, di cui ho bisogno." - Dovresti riuscire a catturare tutte le eccezioni a livello di controller usando lo standard o implementando l'attributo HandleError personalizzato. Cerca di evitare di lanciare un'eccezione durante il rendering della vista. Se ottieni l'eccezione durante il rendering della vista, questo articolo può essere utile per te: http://stackoverflow.com/questions/1074540/how-to-catch-exception-of-mvc-view –
Andrej, I non è in grado di catturare tutte le eccezioni a livello di controller poiché ci sono normali pagine WebForms come altre parti non MVC nell'applicazione, quindi l'unico posto in cui gestire tutti gli errori è l'oggetto dell'applicazione globale. Che va bene, non riesco a capire come "restituire" 404 da lì, in modo che sia gestito da "customErrors". –