块ELMAh中的​​404 FavIco错误

时间:2009-04-17 21:02:20

标签: logging http-status-code-404 elmah

我注意到开箱即用ELMAH在我的本地服务器上记录了找不到favico的404。如何通过过滤器抑制此错误?我对它的配置还不太熟悉..

6 个答案:

答案 0 :(得分:18)

官方的elmah Error Filtering page解释了这种404 favicon错误可以被压制的多种方式。

您可以在web.config中以声明方式过滤掉所有 404错误。我不确定是否有办法仅仅为了一个图标来压制404.

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

如果您想以编程方式执行此操作,则可以忽略ErrorLog或ErrorEmail过滤事件中的错误,如官方文档中所述。下面的代码有点矫枉过正,但它演示了如何为/favicon.ico请求过滤掉 404错误。

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

我个人更喜欢通过web.config以声明方式过滤掉所有404,或者只提供像Joel建议的那样。

答案 1 :(得分:13)

它无法帮助您学习如何配置ELMAH,但防止404请求图标的最简单方法是提供一个...

答案 2 :(得分:5)

我可以通过使用下面的代码让ELMAH忽略错误。您可以添加您想要忽略的任何其他路径。从技术上讲,这些可能是单独的测试,但是如果我想忽略将来与我的应用程序相关的其他404错误,我想我会将这些组合在一起,因为它们不依赖于我的应用程序而且仅在此处从我的错误记录中删除混乱。

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

当然,如果您担心这会使您的web.config混乱,您可以随时将过滤器拆分为专用文件。

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

答案 3 :(得分:4)

并不是我的网络应用程序正在请求图标,而是当我浏览elmah.axd页面时,浏览器会请求图标。

据说,这应该有效:

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

但是猜猜是什么,它没有。

我发现工作的唯一方法是在我的网络根目录中添加一个favicon.ico。这不适用于我的网站,仅适用于elmah.axd页面。不需要呼叫route.IgnoreRoute。

这是我的favicon的elmah.axd,没有错误:

elmah with favicon.ico

答案 4 :(得分:2)

我只是忽略了路线而不是配置Elmah。这对我有用:

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

答案 5 :(得分:1)

我正在使用Kurt Schindler的编程解决方案(vs config);但是,我注意到在ErrorLog_Filtering事件处理程序中,非HttpExceptions被抛出两次。为避免这种情况,请确保对GetBaseException方法进行类型检查。这是片段

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

这里没有什么新东西,如果你碰巧看到一些奇怪的行为,只是一个FYI。

...谢谢