2012-04-17 13 views
29

Ho passato molto tempo a cercare di trovare una soluzione alternativa per questo, inutilmente, quindi ho pensato di vedere se qualcuno qui ha un'idea.La vista "Errore" o il suo master non è stata trovata

Sto usando Elmah in my ASP.NET MVC3 application. Sto usando lo stesso identico codice dalla risposta accettata nel collegamento precedente.

Ho anche questo codice nel mio Global.asax per la visualizzazione di pagine di errore con la corretta risposta HTTP:

/// <summary> 
    /// The customErrors functionality provided by ASP.NET results in HTTP 302 redirects occurring which doesn't accurately reflect what the real HTTP code of the response was. 
    /// This method can be used to handle specific HTTP codes without an intermediate redirect. 
    /// </summary> 
    protected void Application_Error() { 
     var exception = Server.GetLastError(); 
     var httpException = exception as HttpException; 
     Response.Clear(); 
     Server.ClearError(); 
     var routeData = new RouteData(); 
     routeData.Values["controller"] = "Error"; 
     routeData.Values["action"] = "Error500"; 
     Response.StatusCode = 500; 

     if (httpException != null) { 
      Response.StatusCode = httpException.GetHttpCode(); 
      Response.TrySkipIisCustomErrors = true; 
      switch (Response.StatusCode) { 
       case 403: 
        routeData.Values["action"] = "Error403"; 
        break; 
       case 404: 
        routeData.Values["action"] = "Error404"; 
        routeData.Values["message"] = httpException.Message; 
        break; 
       case 500: 
        routeData.Values["action"] = "Error500"; 
        break; 
      } 
     } 

     IController errorsController = new ErrorController(); 
     var rc = new RequestContext(new HttpContextWrapper(Context), routeData); 
     errorsController.Execute(rc); 
    } 

Il problema si verifica quando non sono sulla mia macchina di sviluppo (locale) (che inizialmente ha fatto penso che sia stato collegato a customErrors). Quando viene generata un'eccezione, Elmah gestisce l'errore e lo registra correttamente. Finisco anche sulla pagina di errore corretta. Tuttavia, prima di finire sulla pagina di errore corretto, posso vedere un'altra eccezione intermedio in fase di ingresso:

The view 'Error' or its master was not found or no view engine supports the searched locations. The following locations were searched: ~/Views/Articles/Error.aspx ~/Views/Articles/Error.ascx ~/Views/Shared/Error.aspx ~/Views/Shared/Error.ascx ~/Views/Articles/Error.cshtml ~/Views/Articles/Error.vbhtml ~/Views/Shared/Error.cshtml ~/Views/Shared/Error.vbhtml 

ASP.NET sta tentando di caricare una pagina di errore di default anche se sto cercando di gestirlo. Qualcuno ha qualche idea su come prevenirlo?

risposta

27

Non chiamare il metodo base.OnException(context); nel gestore di errori personalizzato che deriva da HandleErrorAttribute. Non ne hai più bisogno perché hai implementato una gestione personalizzata degli errori in Application_Error.

+0

Questo ha fatto il trucco. Dopo aver esaminato il codice sorgente di HandleErrorAttribute, ho potuto vedere che avevo bisogno di saltare alcune delle funzionalità di base, ma penso che tu abbia ragione a voler saltare la chiamata del tutto e andar bene. Grazie per l'aiuto. –

+0

Questo ha fatto il trucco. –

+0

Sì, questo ha fatto il trucco – JoshYates1980

2

Da qualche parte il tuo sito sta cercando di navigare in ~/Errore e non può trovarlo perché non esiste.

Provare a rimuovere o disabilitare CustomErrors nel proprio Web.config. Sono disposto ad essere il suo set al default di su e reindirizzare a ~/Errore

Se vuoi pubblicare il tuo web.config (tralasciando tutte le informazioni sensibili) Probabilmente posso aiutare. Mi sono occupato di problemi simili con Elmah di recente.

+0

Io in realtà penso io sapere qual è il problema, non sono sicuro del modo migliore per risolverlo. Ho il mio setup di risposte HTTP nel mio Global.asax, ma, l'override di OnException sta eseguendo un suo risultato. Di default quel risultato è la vista che non riesce a trovare, perché l'ho cancellato. Quindi forse ho bisogno di impostare la proprietà 'context.Result' nel mio override di OnException, ma non so come farlo con il mio controller degli errori personalizzati che ho. –

11

Stavo avendo lo stesso problema, ma non stavo eseguendo base.OnException() ovunque. Un'altra possibile soluzione era quella di rimuovere questo da <system.web> nel mio web.config:

<customErrors mode="On" /> 
+6

Se non hai un errore personalizzato nel tuo web.config ne metti uno in modo esplicito con mode = "Off" –

+0

Il commento di Dave è stata la risposta per me –

0

Se si utilizza Elmah.mvc, allora sarà aiuterà a cambiare questa impostazione su true:

<add key="elmah.mvc.disableHandler" value="true" /> 
<add key="elmah.mvc.disableHandleErrorFilter" value="true" /> 
Problemi correlati