Frage

Ich habe bemerkt, aus dem Kasten heraus, dass ELMAH ein protokolliert 404 nicht für favico auf meinem lokalen Server nicht gefunden. Wie unterdrücke ich diesen Fehler durch einen Filter? Ich bin nicht so vertraut mit konfigurierend es noch ..

War es hilfreich?

Lösung

Die offizielle Elmah Fehler Filtering eine Reihe von Möglichkeiten, um dies 404 Favicon erklärt Fehler unterdrückt werden können.

Sie könnten herauszufiltern alle 404 Fehler deklarativ in der web.config wie so. Ich bin nicht sicher, dass es eine Möglichkeit ist, nur wenn ein 404 für einen Favicon surpress.

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

Wenn Sie es wollten programmatisch tun, könnten Sie den Fehler in dem Fehlerprotokoll oder ErrorEmail Filter Ereignisse entlassen, wie in den offiziellen Dokumente erläutert. Der Code unten ist ein bisschen übertrieben, aber es zeigt, wie Sie herausfiltern könnten nur 404 Fehler für eine /favicon.ico Anfrage.

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

Ich würde persönlich entweder bevorzugen Filter alle 404s deklarativ durch die web.config oder bieten nur ein Favicon wie Joel schlägt.

Andere Tipps

Es hilft nicht, Sie lernen, wie ELMAH zu konfigurieren, aber der einfachste Weg, um eine 404-Anfragen zu verhindern, für ein Favicon ein zu schaffen ist ...

Ich konnte ELMAH bekommen, den Fehler zu ignorieren, indem Sie den Code unten. Sie könnten möglicherweise andere Wege, die Sie auch ignorieren möchten hinzufügen. Technisch separate Tests sein, diese könnten aber für den unwahrscheinlichen Fall möchte ich andere 404-Fehler in Zukunft ignorieren, die zu meiner app verwandt sind, dachte ich, ich diese zusammen gruppiert verlassen würde, da sie auf meine Bewerbung nicht abhängig sind überhaupt und sind hier allein Unordnung aus meiner Fehlerprotokollierung zu entfernen.

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

Natürlich, wenn Sie diesen Poltern web.config besorgt sind Sie immer die Filter, um eine dedizierte Datei aufteilen könnte.

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

Es ist nicht, dass meine Web-Anwendung ein Favicon anfordert, ist es, dass, wenn ich auf die elmah.axd Seite zu sehen, fordert der Browser ein Favicon.

Angeblich sollte diese Arbeit:

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

Aber wissen Sie was, es funktioniert nicht.

Der einzige Weg, ich Arbeit gefunden habe, ist eine favicon.ico auf meinen Web-root hinzuzufügen. Dies ist nicht für meine Website, es ist nur für die elmah.axd Seite. müssen NICHT route.IgnoreRoute nennen.

Hier ist elmah.axd mit meinem Favicon, und keine Fehler:

Elmah mit favicon.ico

ich einfach ignorieren die Route anstatt Elmah konfigurieren. Dies funktioniert für mich:

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

Ich war oben (vs config) Kurt Schindler programmatische Lösung verwendet wird; jedoch bemerkte ich, dass nicht-HttpExceptions wurden zweimal in den ErrorLog_Filtering Event-Handler geworfen zu werden. Um dies zu vermeiden, stellen Sie sicher tun, um eine Typprüfung auf der GetBaseException Methode. Hier ist der Code-Schnipsel

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

Nichts Neues hier, nur ein FYI, wenn Sie ein seltsames Verhalten sehen passieren.

Danke ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top