2013-05-22 16 views
11

che ho fatto alcune modifiche per Global.asax in modo che io possa mostrare pagine di errore personalizzate (403, 404, e 500) Ecco il codice:pagine di errore non trovato, gettando errore ELMAH con Pagine di errore

public class MvcApplication : System.Web.HttpApplication 
    { 
     protected void Application_Start() 
     { 
      AreaRegistration.RegisterAllAreas(); 

      WebApiConfig.Register(GlobalConfiguration.Configuration); 
      //FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters); 
      RouteConfig.RegisterRoutes(RouteTable.Routes); 
      BundleConfig.RegisterBundles(BundleTable.Bundles); 
     } 

     protected void Application_Error(object sender, EventArgs e) 
     { 
      if (Context.IsCustomErrorEnabled) 
      { 
       ShowCustomErrorPage(Server.GetLastError()); 
      } 
     } 

     private void ShowCustomErrorPage(Exception exception) 
     { 
      HttpException httpException = exception as HttpException; 
      if (httpException == null) 
      { 
       httpException = new HttpException(500, "Internal Server Error", exception); 
      } 

      Response.Clear(); 
      RouteData routeData = new RouteData(); 
      routeData.Values.Add("controller", "Error"); 
      routeData.Values.Add("fromAppErrorEvent", true); 

      switch (httpException.GetHttpCode()) 
      { 
       case 403: 
        routeData.Values.Add("action", "AccessDenied"); 
        break; 

       case 404: 
        routeData.Values.Add("action", "NotFound"); 
        break; 

       case 500: 
        routeData.Values.Add("action", "ServerError"); 
        break; 

       default: 
        routeData.Values.Add("action", "DefaultError"); 
        routeData.Values.Add("httpStatusCode", httpException.GetHttpCode()); 
        break; 
      } 

      Server.ClearError(); 

      IController controller = new ErrorController(); 
      controller.Execute(new RequestContext(new HttpContextWrapper(Context), routeData)); 
     } 
    } 

ho anche aggiunto il seguente al mio web.config:

pagine di errore
<customErrors mode="On"> 
    <!-- There is custom handling of errors in Global.asax --> 
</customErrors> 

la personalizzati visualizzati correttamente, e ELMAH registrerà correttamente l'errore che è stato (volutamente) gettato. Ma anche ELMAH cattura e registra un errore aggiuntivo:

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

miei primi istinto mi ha portato alla disattivazione globale HandleErrorAttribute nella configurazione del filtro. E domande simili come: MVC problem with custom error pages mi hanno indotto a credere che i miei sospetti fossero corretti. Ma anche dopo aver disabilitato il globale HandleErrorAttribute, sto ancora ricevendo l'errore che la vista Errori non è stata trovata! Cosa dà? La mia unica altra impressione è che il mio controller di base deriva dal System.Web.Mvc.Controller ho cercato di esaminare la fonte per vedere se il HandleErrorAttribute viene applicato al System.Web.Mvc.Controller ma non poteva ricavare nulla ...

UPDATE: ho provato sovrascrivendo il mio controller di base per contrassegnare le eccezioni come gestite in questo modo:

protected override void OnException(ExceptionContext filterContext) 
{ 
    filterContext.ExceptionHandled = true; 
    base.OnException(filterContext); 
} 

ma che non ha risolto il problema.

UPDATE2: Ho inserito un file Error.aspx nelle viste condivise, solo per vedere cosa sarebbe successo. Quando è lì, ELMAH registra l'eccezione forzata, e quindi la vista condivisa viene pubblicata - non raggiunge mai lo Application_Error() .... non sono sicuro di cosa farne.

risposta

26

finalmente arrivati ​​a lavorare per la mia soddisfazione ...

Il pacchetto Elmah.Mvc applica un gestore di errori "nascosto". Ho disattivato questo aggiungendo la seguente riga nel web.config <appSettings> (il valore è stato impostato su "false" per impostazione predefinita da NuGet installare)

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

Così, ora i miei errori si propagano fino a Application_Error e vengono registrati dal Elmah, ignorando il filtro Elmah e visualizza la pagina di errore corretta (non quella in /shared/error.cshtml)

+4

Inoltre, assicurati che l'MVC predefinito error handler è stato rimosso da FilterConfig – solidau

+1

Questo è stato davvero difficile da trovare ... grazie –

+0

http: // beletsky.net/2012/11/elmahmvc-202-is-out.html "È elmah.mvc.disableHandleErrorFilter. Di default è' false', che significa 'HandleErrorAttribute()' di ELMAH.MVC. Per disabilitarlo, basta impostare fedele a questa impostazione. " – PussInBoots

1

Se si utilizza la modalità integrata di IIS 7, sarà necessario aggiungere Response.TrySkipIisCustomErrors = true; in Application_Error. Altrimenti IIS continuerà a reindirizzare il client a una pagina di errore personalizzata, nonostante tutto ciò che fai nel codice.

Vedi qui per maggiori dettagli: http://www.west-wind.com/weblog/posts/2009/Apr/29/IIS-7-Error-Pages-taking-over-500-Errors

Edit: ecco il corpo del mio Application_Error:

if (HttpContext.Current != null) 
{ 
    Server.ClearError(); 
    Response.TrySkipIisCustomErrors = true; 
    RouteData data = new RouteData(); 
    data.Values.Add("controller", "Error"); 
    data.Values.Add("action", "Error"); 
    IController controller = new MyApp.Controllers.ErrorController(); 
    controller.Execute(new RequestContext(new HttpContextWrapper(Context), data)); 
} 
+0

Ho provato ad aggiungere prima e dopo 'Response.Clear();' in 'ShowCustomErrorPage'. Non ha funzionato :( – solidau

+0

anche provato come prima riga in 'Application_Error' – solidau

+1

Provare ad impostarlo dopo' Response.ClearError() '. Ecco dove ho il mio. – anwright

Problemi correlati