2009-04-17 6 views
8

Me di cuenta de que ELMAH registra un 404 no encontrado para favico en mi servidor local. ¿Cómo suprimo este error a través de un filtro? No estoy tan familiarizado con la configuración todavía ...Error 404 FavIco del bloque en ELMAh

Respuesta

18

El elh oficial Error Filtering page explica varias formas en que se puede suprimir este error de favicon 404.

Puede filtrar todos errores 404 declarativamente en la web.config como tal. Sin embargo, no estoy seguro de que exista una forma de suprimir un 404 para un favicon.

<errorFilter> 
    <test> 
     <equal binding="HttpStatusCode" value="404" type="Int32" /> 
    </test> 
</errorFilter> 

Si quisiera hacerlo mediante programación, podría descartar el error en los eventos de filtrado ErrorLog o ErrorEmail como se explica en los documentos oficiales. El código siguiente es un poco exagerado, pero demuestra cómo podría filtrar solo errores 404 para una solicitud /favicon.ico.

void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e) 
{ 
    if (((HttpException)e.Exception.GetBaseException()).GetHttpCode() == 404 
     && ((HttpContext)e.Context).Request.Path == "/favicon.ico") 
    { 
     e.Dismiss(); 
    } 
} 

me gustaría personalmente prefiero a cualquiera de los filtros todos los 404 declarativa a través del web.config, o simplemente proporcionar un favicon como Joel sugiere.

+0

Esto haría el trabajo, pero yo no recomendaría filtrar * todos * 404 errores. Eso es como limitar el poder de ELMAH. Estoy más a favor del enfoque de Joel en el que realmente * arreglas * el problema. – senfo

+2

loL! Acabo de ir ... oh sí, ¡puedo agregar un favicon! – gideon

13

No le ayuda a aprender a configurar ELMAH, pero la manera más fácil de evitar un 404 para las solicitudes de un favicon es proporcionarle uno ...

2

simplemente ignoro la ruta en lugar de configurar Elmah. Esto funciona para mí:

routes.IgnoreRoute("{*favicon}", new {[email protected]"(.*/)?favicon.ico(/.*)?"}); 
+1

¿Estás seguro de que has verificado esto con ELMAH? Ignorar la ruta no funciona. Simplemente provoca que MVC ignore la solicitud y la transfiere a la canalización regular de ASP.NET que la contiene, lo que hace que se registre en ELMAH. –

+0

Ha pasado un tiempo desde que miré ese código, así que tendría que volver a verificarlo, pero utilicé la técnica en un sitio en vivo y pareció funcionar para mí. ¿Es una diferencia entre IIS6 e IIS7? – Junto

+0

Si lo necesita o no depende de la configuración del servidor. Para Cassini (depuración de Visual Studio), esos 404 son registrados por Elmah. Para IIS 6, Elmah no los ve si el enrutamiento los ignora. No he probado IIS 7. –

1

Estaba usando la solución programática de Kurt Schindler anterior (vs config); sin embargo, noté que las excepciones que no son HttpExceptions se lanzaban dos veces en el controlador de eventos ErrorLog_Filtering. Para evitar esto, asegúrese de hacer una comprobación de tipo en el método GetBaseException. Aquí está el fragmento

void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e) 
{ 
    if (e.Exception.GetBaseException() is HttpException) 
    { 
     if (((HttpException)e.Exception.GetBaseException()).GetHttpCode() == 404 
      && ((HttpContext)e.Context).Request.Path == "/favicon.ico") 
     { 
      e.Dismiss(); 
     } 
    } 
} 

Nada nuevo aquí, solo un FYI si observas un comportamiento extraño.

Gracias ...

4

No es que mi aplicación web está solicitando un favicon, es que cuando me vaya a la página de elmah.axd, el navegador solicita un favicon.

Supuestamente, esto debería funcionar:

<elmah> 
    <errorFilter> 
    <test> 
     <and> 
      <equal binding="HttpStatusCode" 
       value="404" type="Int32" /> 
      <regex binding="Context.Request.ServerVariables['URL']" 
       pattern="/favicon\.ico(\z|\?)" /> 
     </and> 
    </test> 
</errorFilter> 
</elmah> 

Pero adivinen qué, no lo hace.

La única forma en que he encontrado que funciona es agregar un favicon.ico a mi raíz web. Esto no es para mi sitio, es solo para la página elmah.axd. NO es necesario llamar a route.IgnoreRoute.

Aquí está elmah.axd con mi favicon, y no hay errores:

elmah with favicon.ico

+2

Oye, Matt, debe asegurarse de registrar su ErrorFilter tanto en el httpModule como en el Módulos system.webServer: y deben registrarse después de que los manejadores ErrorLog sean (o cualquier otro módulo de registro): es una pila inversa, prioritaria. –

+0

@Matt Enright Buen comentario. – Kuncevic

5

que era capaz de conseguir ELMAH ignorar el error utilizando el código de abajo. También podría agregar otras rutas que desee ignorar. Técnicamente, estas podrían ser pruebas separadas, pero en caso de que quiera ignorar otros errores 404 en el futuro que están relacionados con mi aplicación, pensé que los dejaría agrupados ya que no dependen de mi aplicación en absoluto y están aquí únicamente. para eliminar el desorden de mi registro de errores

<errorFilter> 
    <test> 
     <or> 
      <and> 
       <equal binding="HttpStatusCode" value="404" type="Int32" /> 
       <equal binding="Context.Request.Path" value="/favicon.ico" type="string" /> 
      </and> 
      <and> 
       <equal binding="HttpStatusCode" value="404" type="Int32" /> 
       <equal binding="Context.Request.Path" value="/robots.txt" type="string" /> 
      </and> 
     </or> 
    </test> 
</errorFilter> 

Por supuesto, si usted está preocupado acerca de este estorbar su web.config siempre se puede dividir los filtros en un archivo dedicado.

<elmah> 
    <security allowRemoteAccess="1" /> 
    <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="elmah-sqlserver" /> 
    <errorFilter configSource="elmahFilters.config" /> 
</elmah>