5

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:

  1. Qual è il modo corretto di tradurre AnException in HTTP 404 risposta?
  2. Come funziona la sezione customErrors quando si gestiscono le eccezioni in Application_Error?
  3. Perché il lancio di HttpException (404) rende la pagina (vuota) con stato di successo (200)?

Grazie,
Dmitriy.

risposta

2

In poche parole, se si imposta manualmente lo stato HTTP in Application_Error, si perde la possibilità di utilizzare il gestore di sezione customErrors, poiché si chiama Server.ClearError().

Gestire l'eccezione prima di Application_Error o derivare l'eccezione da HttpException.

  • Qual è il modo corretto di tradurre AnException in risposta HTTP 404?

È meglio gestire le eccezioni in Controller. È possibile introdurre il controller della classe base e gestire la maggior parte delle eccezioni nell'attributo HandleError personalizzato. Puoi lanciare HttpException e sarà gestito correttamente dal gestore di sezioni customErrors.

Si può anche derivare vostra eccezione ObjectNotFoundException da HttpException (404)

Application_Error è l'ultima possibilità di gestire un'eccezione. Hai solo le API di risposta per gestirle. È possibile impostare manualmente il codice di stato e scrivere sulla risposta o attivare manualmente il reindirizzamento alla pagina di errore personalizzata o chiamare Server.TransferRequest() sul file html o aspx esistente (non sull'azione del controller). Nella versione corrente di asp.net, non è possibile impostare o modificare Server.GetLastError nel metodo Application_Error solo recuperarlo o cancellarlo.

  • Come funziona la sezione customErrors quando si gestiscono le eccezioni in Application_Error?

Chiamando Server.ClearError() si anche pulito errore richiesta corrente, pertanto non è gestito dalla sezione customErrors gestore

  • Perché buttare HttpException (404) rende (vuoto) la pagina con lo status di successo (200)?

Non si dovrebbe generare alcuna eccezione nel metodo Application_Error. Eccezione significa che la gestione degli errori è fallita.

+0

'È 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. –

+0

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 –

+0

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". –