Pregunta

Me di cuenta de la caja 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 configurating todavía ..

¿Fue útil?

Solución

La página oficial ELMAH error de filtrado explica un número de maneras en que esto 404 favicon error podría ser suprimida.

Se puede filtrar los todos 404 errores de forma declarativa en el web.config como tal. No estoy seguro de que hay una manera de surpress sólo 404 para un favicon sin embargo.

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

Si quisiera hacerlo mediante programación, se puede 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 se puede filtrar solamente 404 errores 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();
    }
}

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

Otros consejos

No ayuda a aprender cómo configurar ELMAH, pero la forma más fácil de evitar un 404 solicitudes para un favicon es proporcionar una ...

Yo era capaz de conseguir ELMAH ignorar el error utilizando el código de abajo. Usted podría añadir cualquier otra ruta que desea ignorar también. Técnicamente estos podrían ser pruebas separadas, sino en la remota posibilidad de que querer ignorar otros 404 errores en el futuro que están relacionados con mi aplicación, pensé que había que dejar estas agrupan ya que no dependen de mi solicitud alguna y únicamente están aquí 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>

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 que he encontrado para trabajar es añadir un favicon.ico a raíz de la tela. Esto no es para mi sitio, que es sólo para la página elmah.axd. No es necesario que llame route.IgnoreRoute.

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

ELMAH con favicon.ico

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

routes.IgnoreRoute("{*favicon}", new {favicon=@"(.*/)?favicon.ico(/.*)?"});

I estaba usando solución programática de Kurt Schindler anteriormente (config vs); Sin embargo, he notado que no HttpExceptions estaban siendo lanzados dos veces en el controlador de eventos ErrorLog_Filtering. Para evitar esto, asegúrese de hacer un tipo de comprobación en el método GetBaseException. He aquí 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();
        }
    }
}

No hay nada nuevo aquí, como digo, si llegan a ver un comportamiento extraño.

Gracias ...

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top