2009-04-17 28 views

回答

18

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

你可能会过滤掉全部 404错误声明在web.config中是这样的。我不确定是否有办法仅仅为了图标而压制404。

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

如果你想以编程方式做到这一点,你可以在官方文档解释解雇在错误日志或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声明过滤所有的404s,或者只是提供像Joel建议的favicon。

+0

这会做这项工作,但我不会推荐过滤*所有* 404错误。这有点限制了ELMAH的力量。我更倾向于乔尔的方法,在那里你真正解决了问题。 – senfo 2009-11-11 15:55:39

+2

!我只是去..哦,是的,我只是实际上添加一个favicon! – gideon 2010-12-21 14:29:41

13

它不帮助你了解如何配置ELMAH,但最简单的方法来防止404请求的favicon是提供一个...

2

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

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

你确定你真的用ELMAH检查过吗?忽略路线不起作用。它只是导致请求被MVC忽略,并传递给404的常规ASP.NET管道,导致它被记录在ELMAH中。 – 2010-09-17 12:06:26

1

我正在使用上面的Kurt Schindler的编程解决方案(vs config);然而,我注意到非HttpExceptions在ErrorLog_Filtering事件处理程序中被抛出两次。为避免这种情况,请确保您对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,如果你碰巧看到一些奇怪的行为。

谢谢...

4

这不是我的Web应用程序请求图标,那就是,当我浏览到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到我的web根目录。这不是我的网站,它只适用于elmah.axd页面。不需要调用route.IgnoreRoute。

这里的elmah.axd与我的图标,并没有错误:

elmah with favicon.ico

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>