2011-09-01 14 views
10

tengo costumbre páginas de error de configuración conMVC InvalidOperationException con las páginas de error personalizadas

<customErrors mode="On" defaultRedirect="~/Home/Error"> 
    <error statusCode="404" redirect="~/Home/PageNotFound" /> 
</customErrors> 

creé una página que lanza y la excepción y me redirigen a las páginas de error correctos.

Sin embargo estoy notando estos errores en ELMAH en el servidor web de producción:

System.InvalidOperationException se no encontrado El punto de vista 'error' o su maestra o sin motor de vista apoya los lugares buscados. Los siguientes lugares Se realizaron búsquedas: ~/Áreas/Fútbol/Vistas/Proyecto/Error.aspx ~/Áreas/Fútbol/Vistas/Proyecto/Error.ascx ~/Áreas/Fútbol/Vistas/Shared/Error.aspx ~/Areas/Football/Views/Shared/Error.ascx ~/Views/Draft/Error.aspx ~/Views/Draft/Error.ascx ~/Views/Shared/Error.aspx ~/Views/Shared/Error. ascx ~/Areas/Football/Views/Draft/Error.cshtml ~/Areas/Football/Views/Draft/Error.vbhtml ~/Areas/Football/Views/Shared/Error.cshtml ~/Areas/Fútbol/Vistas /Shared/Error.vbhtml ~/Views/Draft/Error.cshtml ~/Views/Draft/Error.vbhtml ~/Views/Shared/Error.cshtml ~/Views/Shared/Error.vbhtml

¿Por qué está buscando la página de error en otro lugar? Eliminé ~/Views/Shared/Error.cshtml y agregué mi página de error personalizada en ~/Inicio/Error ya que especifiqué un nuevo valor predeterminado en mi archivo de configuración.

¿Alguna idea?

Gracias.

+0

Desde 'customErrors' es algo ASP.NET con ofertas (no ASP .NET MVC), no es la mejor herramienta para el trabajo. Richard Dingwall tiene un excelente post sobre esto: http://richarddingwall.name/2008/08/17/strategies-for-resource-based-404-errors-in-aspnet-mvc/ –

Respuesta

26

proyectos MVC por defecto añade el HandleErrorAttribute en el archivo

public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Add(new HandleErrorAttribute()); 
    } 

Global.asax.cs Este filtro se ejecuta cuando se produce una excepción no controlada. Establece la vista como Error. Por lo tanto, el tiempo de ejecución MVC intenta renderizar esa vista. Pero en tu caso, no hay tal opinión. Por lo tanto, arroja otra excepción que es manejada por el tiempo de ejecución de ASP.NET y muestra su página de error que ha configurado en el archivo Web.Config.

Puede crear su propio filtro de excepción y registrarlo.

+0

Gracias tienes razón en que parece ser exactamente lo que está sucediendo Volví a colocar la vista de error predeterminada y lancé una excepción, desapareció ese error sobre no encontrar la vista predeterminada. Sin embargo, elmah no registra la excepción. Estoy de acuerdo con el uso de la vista predeterminada, pero ¿cómo es que elmah no registra los errores? Registra 404 correctamente, pero no los errores del servidor 500. –

+2

@Aros - que necesita para implementar una versión especial de la HandleErrorAttribute para Elmah. Usted puede encontrar una exmaple aquí: http://www.hanselman.com/blog/ELMAHErrorLoggingModulesAndHandlersForASPNETAndMVCToo.aspx –

+0

Gracias por ahora comentada la línea en la respuesta, y estoy confiando en errores personalizados de redirigir web.config. Usaré la respuesta aquí si eso causa problemas. http://stackoverflow.com/questions/766610/how-to-get-elmah-to-work-with-asp-net-mvc-handleerror-attribute/779961#779961 Alguien sabe por qué no me gustaría hacer comentarios esa linea de codigo? –

5

Terminé sacando el registro de HandleErrorAttribute en Global.asax y simplemente usando la sección <customErrors>. ELMAH ahora registra correctamente los errores, y puedo especificar páginas de error personalizadas.

¿Echo de menos algo?

+0

Parece que funciona para mí, me pone un poco nervioso pero no puede ver nada malo con eso. – andrewb

+0

Funcionó para mí usando errores personalizados con StackExchange.Exceptional en lugar de Elmah. – Gareth

0

Para futuros lectores de esta publicación, tenga en cuenta que Elmah agrega su propio HandleErrorAttribute, por lo que también está esperando la vista Error.cshtml. Tenga en cuenta que también instalé el paquete Elmah.MVC NuGet pero eso solo se usa para configurarlo correctamente.

Sí, acabo de dar cuenta de que nuget.org Elmah.MVC es responsable de añadir el HandleErrorAttribute:

integración indolora de funcionalidad ELMAH en ASP.NET MVC aplicación. Solo deja caer el paquete dentro de tu ASP.Aplicación NET MVC y acceso/elmah URL. También instalará filtro HandleError mundial, que garantiza todos los errores no controlados se registran (incluso si CustomError en "On").

1

También puede asegurarse de que el HandleErrorAttribute no está registrado quitándolo de los filtros globales, utilizando el método de Remove:

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     filters.Remove(new HandleErrorAttribute()); 
     /* ... your other filters */ 
    } 
} 
Cuestiones relacionadas