【发布时间】:2010-10-20 05:13:12
【问题描述】:
我注意到 ELMAH 在我的本地服务器上记录了一个 404 not found for favico。如何通过过滤器抑制此错误?我对配置它还不是很熟悉..
【问题讨论】:
标签: logging http-status-code-404 elmah
我注意到 ELMAH 在我的本地服务器上记录了一个 404 not found for favico。如何通过过滤器抑制此错误?我对配置它还不是很熟悉..
【问题讨论】:
标签: logging http-status-code-404 elmah
它不能帮助您了解如何配置 ELMAH,但防止 404 请求网站图标的最简单方法是提供一个...
【讨论】:
官方 elmah Error Filtering page 解释了可以抑制此 404 图标错误的多种方法。
您可以像这样在 web.config 中以声明方式过滤掉 所有 404 错误。不过,我不确定是否有办法只为网站图标抑制 404。
<errorFilter>
<test>
<equal binding="HttpStatusCode" value="404" type="Int32" />
</test>
</errorFilter>
如果您想以编程方式执行此操作,您可以消除 ErrorLog 或 ErrorEmail 过滤事件中的错误,如官方文档中所述。下面的代码有点矫枉过正,但它演示了如何为 /favicon.ico 请求过滤 only 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 建议的那样只提供一个网站图标。
【讨论】:
我只是忽略路由而不是配置 Elmah。这对我有用:
routes.IgnoreRoute("{*favicon}", new {favicon=@"(.*/)?favicon.ico(/.*)?"});
【讨论】:
我在上面使用了 Kurt Schindler 的编程解决方案(与配置相比);但是,我注意到在 ErrorLog_Filtering 事件处理程序中两次抛出非 HttpExceptions。为避免这种情况,请确保对 GetBaseException 方法进行类型检查。这是sn-p
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();
}
}
}
这里没有什么新鲜事,如果您碰巧看到一些奇怪的行为,仅供参考。
谢谢...
【讨论】:
并不是我的网络应用程序在请求一个网站图标,而是当我浏览到 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。
这是带有我的图标的 elmah.axd,没有错误:
【讨论】:
通过使用下面的代码,我能够让 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>
【讨论】: