2009-04-17 10 views
8

Ho notato che ELMAH registra un 404 non trovato per favico sul mio server locale. Come posso sopprimere questo errore attraverso un filtro? Non ho ancora familiarità con la configurazione.Blocco 404 Errore FavIco in ELMAh

risposta

18

L'elmah Error Filtering page ufficiale spiega un numero di modi in cui questo errore di favicon 404 potrebbe essere rimosso.

È possibile filtrare tutti gli errori 404 in modo dichiarativo nel file web.config in questo modo. Non sono sicuro che ci sia un modo per sopprimere solo un 404 per una favicon.

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

Se si voleva fare a livello di codice, si potrebbe respingere l'errore negli eventi di filtraggio ErrorLog o ErrorEmail come spiegato nella documentazione ufficiale. Il codice riportato di seguito è un po 'eccessivo, ma dimostra come è possibile filtrare gli errori solo 404 per una richiesta /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(); 
    } 
} 

Preferirei personalmente a uno filtro tutti i 404s dichiarativo attraverso il web.config, o semplicemente fornire una favicon come suggerisce Joel.

+0

Questo farebbe il lavoro, ma non consiglierei di filtrare * tutti gli errori * 404. Questo è un po 'come limitare il potere di ELMAH. Sono più favorevole all'approccio di Joel in cui in realtà * ripari * il problema. – senfo

+2

loL! Sono appena andato .. oh si, posso solo aggiungere una favicon! – gideon

13

Non aiuta a imparare come configurare ELMAH, ma il modo più semplice per evitare un 404 per le richieste di un favicon è quello di fornire uno ...

2

Ho appena ignorato il percorso anziché configurare Elmah. Questo funziona per me:

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

Sei sicuro di averlo effettivamente verificato con ELMAH? Ignorare la rotta non funziona. Semplicemente fa sì che la richiesta venga ignorata da MVC e passata alla pipeline ASP.NET normale che la trasmette a 404, causando l'accesso a ELMAH. –

+0

È passato un po 'di tempo da quando ho guardato quel codice, quindi avrei dovuto ricontrollare, ma ho usato la tecnica su un sito live e sembrava funzionare per me. È una differenza tra IIS6 e IIS7? – Junto

+0

Se lo si desidera o no dipende dalla configurazione del server. Per Cassini (debug di Visual Studio), quegli 404 vengono registrati da Elmah. Per IIS 6, Elmah non li vede se vengono ignorati dal routing. Non ho provato IIS 7. –

1

Stavo usando la soluzione programmatica di Kurt Schindler sopra (vs config); tuttavia, ho notato che non HttpException veniva lanciata due volte nel gestore di eventi ErrorLog_Filtering. Per evitare ciò, assicurati di eseguire un controllo del tipo sul metodo GetBaseException. Ecco lo snippet

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(); 
     } 
    } 
} 

Niente di nuovo qui, solo una FYI se capita di vedere qualche strano comportamento.

Grazie ...

4

Non è che la mia applicazione web richiede una favicon, è che quando passo in rassegna alla pagina elmah.axd, il browser richiede una favicon.

Presumibilmente, questo dovrebbe funzionare:

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

Ma indovinate un po ', non è così.

L'unico modo in cui ho trovato che funziona è aggiungere un favicon.ico alla mia web root. Questo non è per il mio sito, è solo per la pagina elmah.axd. NON è necessario chiamare route.IgnoreRoute.

Ecco elmah.axd con la mia favicon, e nessun errore:

elmah with favicon.ico

+2

Hey Matt, devi assicurarti di registrare il tuo ErrorFilter sia nel httpModule che nel moduli system.webServer - e devono essere registrati dopo che i gestori di ErrorLog sono (o qualsiasi altro modulo di registrazione) - è uno stack inverso, prioritario. –

+0

@Matt Enright Buon commento. – Kuncevic

5

sono stato in grado di ottenere ELMAH di ignorare l'errore utilizzando il codice qui sotto. Potresti potenzialmente aggiungere altri percorsi che vuoi ignorare. Tecnicamente questi potrebbero essere test separati ma se avessi la possibilità di ignorare altri 404 errori in futuro correlati alla mia app, ho pensato di lasciarli raggruppati poiché non dipendono dalla mia applicazione e sono qui solo rimuovere la confusione dalla mia registrazione degli errori.

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

Naturalmente se siete preoccupati per questo ingombrare il web.config si può sempre dividere i filtri in un file dedicato.

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