我注意到 ELMAH 在我的本地服务器上记录了一个 404 not found for favico。如何通过过滤器抑制此错误?我对配置它还不是很熟悉..
6 回答
官方 elmah错误过滤页面解释了可以抑制此 404 图标错误的多种方法。
您可以像这样在 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 建议的那样提供一个 favicon。
它不能帮助您了解如何配置 ELMAH,但防止 404 请求网站图标的最简单方法是提供一个...
通过使用下面的代码,我能够让 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>
并不是我的 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 添加到我的网络根目录。这不适用于我的网站,仅适用于 elmah.axd 页面。不需要调用 route.IgnoreRoute。
这是带有我的 favicon 的 elmah.axd,没有错误:
我只是忽略路线而不是配置 Elmah。这对我有用:
routes.IgnoreRoute("{*favicon}", new {favicon=@"(.*/)?favicon.ico(/.*)?"});
我在上面使用了 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();
}
}
}
这里没有什么新鲜事,如果您碰巧看到一些奇怪的行为,仅供参考。
谢谢...