Pergunta

notei fora da caixa que ELMAH registra um 404 não encontrado para favico no meu servidor local. Como faço para suprimir este erro através de um filtro? Eu não sou tão familiarizado com configurando-lo ainda ..

Foi útil?

Solução

O elmah Erro página oficial Filtering explica uma série de maneiras que este favicon 404 erro pode ser suprimida.

Você pode filtrar todas 404 erros declarativa no web.config assim. Eu não estou certo que há uma maneira apenas Suprimir a 404 para um favicon embora.

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

Se você quiser fazê-lo por meio de programação, você pode ignorar o erro nos eventos de filtragem ErrorLog ou ErrorEmail como explicado nos documentos oficiais. O código abaixo é um pouco exagerado, mas demonstra como você pode filtrar única 404 erros para um pedido /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();
    }
}

Eu pessoalmente prefiro a qualquer filtro de todos os 404s declarativa através do web.config, ou apenas fornecer um favicon como Joel sugere.

Outras dicas

Não ajudá-lo a aprender a configurar ELMAH, mas a maneira mais fácil de evitar uma 404 para pedidos de um favicon é fornecer um ...

Eu era capaz de conseguir ELMAH para ignorar o erro usando o código abaixo. Você poderia potencialmente adicionar outros caminhos que você deseja ignorar também. Tecnicamente estes poderiam ser testes separados, mas na chance eu quero ignorar outros erros 404 no futuro, que estão relacionados com o meu aplicativo, eu percebi que eu deixá-los agrupados uma vez que não são dependentes de minha candidatura qualquer e está aqui apenas a desorganização Eliminar da minha registro de erros.

<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>

É claro que se você está preocupado com esta bagunçando seu web.config você pode sempre dividir os filtros em um arquivo dedicado.

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

Não é que a minha aplicação web está solicitando um favicon, é que quando eu navegar para a página elmah.axd, o navegador solicita um favicon.

Supostamente, isso deve 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>

Mas adivinhem, isso não acontece.

A única maneira que eu encontrei para trabalhar é para adicionar um favicon.ico para o meu web raiz. Isto não é para o meu site, é somente para a página elmah.axd. Não precisa chamar route.IgnoreRoute.

Aqui está elmah.axd com o meu favicon, e nenhum erro:

elmah com favicon.ico

i simplesmente ignorar a rota em vez de configurar Elmah. Isso funciona para mim:

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

eu estava usando solução de programação de Kurt Schindler acima (vs config); No entanto, notei que não HttpExceptions estavam sendo jogado duas vezes no manipulador de eventos ErrorLog_Filtering. Para evitar isso, certifique-se de fazer um tipo de check-no método GetBaseException. Aqui está o trecho

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 de novo aqui, apenas um FYI se acontecer de você ver algum comportamento estranho.

Obrigado ...

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top