2012-04-17 17 views
29

He pasado mucho tiempo tratando de encontrar una solución para esto en vano, así que pensé que vería si alguien aquí tiene una idea.La vista 'Error' o su maestro no se encontró

Estoy usando Elmah in my ASP.NET MVC3 application. Estoy usando exactamente el mismo código de la respuesta aceptada en el enlace anterior.

también tengo este código en mi Global.asax para la visualización de páginas de error con la correcta respuesta 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); 
    } 

El problema se produce cuando no estoy en mi máquina de desarrollo (local) (que hizo inicialmente me parece que fue customErrors relacionado). Cuando se lanza una excepción, Elmah maneja el error y lo registra correctamente. También termino en la página de error correcta. Sin embargo, antes de terminar en la página de error correcto, puedo ver otra excepción intermedia está registrando:

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 está tratando de cargar una página de error por defecto a pesar de que estoy tratando de manejarlo. ¿Alguien tiene alguna idea sobre cómo prevenir esto?

Respuesta

27

No llame al método base.OnException(context); en su controlador de error personalizado que deriva de HandleErrorAttribute. Ya no lo necesita porque ha implementado un manejo de error personalizado en Application_Error.

+0

Eso hizo el truco. Después de ver el código fuente del HandleErrorAttribute pude ver que necesitaba saltear algunas de las funciones básicas, pero creo que está en lo cierto al decir que puedo omitir las llamadas y estar bien. Gracias por la ayuda. –

+0

Eso hizo el truco. –

+0

Sí, eso hizo el truco – JoshYates1980

2

En algún lugar su sitio está intentando navegar a ~/Error y no puede encontrarlo porque no existe.

Intentando eliminar o deshabilitar customErrors en su Web.config. Estoy dispuesto a ser su conjunto al valor predeterminado de en y redirigir a ~/Error

Si desea publicar su Web.config (omitiendo cualquier información sensible) Es probable que pueda ayudar. He tratado con problemas similares con Elmah recientemente.

+0

hecho, creo que saber cuál es el problema, simplemente no estoy seguro sobre la mejor manera de resolverlo. Tengo mi configuración de respuestas HTTP en mi Global.asax, pero la anulación de OnException está ejecutando un resultado propio. Por defecto, ese resultado es la vista que no puede encontrar, porque lo eliminé. Así que tal vez necesite establecer la propiedad 'context.Result' en mi excepción OnException, pero no sé cómo hacerlo con mi controlador de errores personalizado que tengo. –

11

Estaba teniendo el mismo problema, pero no estaba ejecutando base.OnException() en ninguna parte. Otra posible solución era quitar esto desde <system.web> en mi web.config:

<customErrors mode="On" /> 
+6

Si no tiene un CustomErrors en su web.config ponga uno explícitamente con mode = "Off" –

+0

El comentario de Dave fue la respuesta para mí –

0

Si utiliza Elmah.mvc, a continuación, que le ayudará a cambiar esta configuración en true:

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