Domanda

Ho notato fuori dalla scatola che ELMAH registra un 404 non trovato per favico sul mio server locale. Come faccio a eliminare questo errore attraverso un filtro? Io non sono così familiarità con apposita configurazione ancora ..

È stato utile?

Soluzione

La pagina di filtraggio ELMAH errore spiega un certo numero di modi in cui questo 404 favicon errore potrebbe essere soppressa.

Si potrebbe filtrare tutti 404 errori in modo dichiarativo nel web.config in questo modo. Io non sono certo c'è un modo allo scopo di sopprimere solo 404 per una favicon però.

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

Se si voleva fare a livello di codice, è possibile respingere l'errore nel log degli errori o ErrorEmail eventi di filtraggio come spiegato nella documentazione ufficiale. Il codice qui sotto è un po 'eccessivo, ma dimostra come è possibile filtrare i solo 404 errori 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();
    }
}

io personalmente preferisco sia filtro tutti i 404s dichiarativo attraverso il web.config, o semplicemente fornire una favicon come suggerisce Joel.

Altri suggerimenti

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

Sono stato in grado di ottenere ELMAH di ignorare l'errore utilizzando il codice qui sotto. Si potrebbe potenzialmente aggiungere altri percorsi che si desidera ignorare pure. Tecnicamente queste potrebbero essere le prove separate, ma sulla remota possibilità che voglio ignorare altri errori 404 nel futuro che sono legati alla mia app, ho pensato di lasciare queste raggruppate in quanto non dipendono da mia applicazione di alcun tipo e sono qui solo per rimuovere l'ingombro 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>

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

In teoria, 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 che ho trovato per il lavoro è quello di aggiungere un favicon.ico al mio principale web. 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 con favicon.ico

Ho appena ignorare il percorso piuttosto che la configurazione Elmah. Questo funziona per me:

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

Sono stato utilizzando la soluzione programmatica di Kurt Schindler sopra (vs config); Tuttavia, ho notato che i non HttpExceptions stavano ottenendo gettati due volte nel gestore di eventi ErrorLog_Filtering. Per evitare questo, assicuratevi di fare un tipo di controllo sul metodo GetBaseException. Ecco il frammento di codice

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 cronaca se vi capita di vedere qualche strano comportamento.

Grazie ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top