ELMAH - 过滤 404 错误
Posted
技术标签:
【中文标题】ELMAH - 过滤 404 错误【英文标题】:ELMAH - Filtering 404 Errors 【发布时间】:2011-02-20 16:53:27 【问题描述】:我正在尝试将 ELMAH 配置为过滤 404 错误,但在我的 Web.config 文件中使用 XML 提供的过滤规则时遇到了困难。我按照教程here 和here 并在<test><or>...
声明下添加了<is-type binding="BaseException" type="System.IO.FileNotFoundException" />
声明,但这完全失败了。
当我在本地测试它时,我在 Global.asax 的 void ErrorLog_Filtering()
中设置了一个断点,发现 ASP.NET 为 404 触发的 System.Web.HttpException
似乎没有 @987654327 的基本类型@,而是只是一个System.Web.HttpException
。我通过在事件处理程序中调用e.Exception.GetBaseException().GetType()
对此进行了测试。
接下来我决定尝试<regex binding="BaseException.Message" pattern="The file '/[^']+' does not exist" />
,希望任何与“文件'/foo.ext'不存在”模式匹配的异常消息都会被过滤,但这也没有效果。作为最后的手段,我尝试了<is-type binding="BaseException" type="System.Exception" />
,甚至完全忽略了这一点。
我倾向于认为 ELMAH 存在配置错误,但我没有看到任何错误。我是否遗漏了一些明显的东西?
这是我的 web.config 中的相关内容:
<configuration>
<configSections>
<sectionGroup name="elmah">
<section name="security" requirePermission="false" type="Elmah.SecuritySectionHandler, Elmah"/>
<section name="errorLog" requirePermission="false" type="Elmah.ErrorLogSectionHandler, Elmah"/>
<section name="errorMail" requirePermission="false" type="Elmah.ErrorMailSectionHandler, Elmah"/>
<section name="errorFilter" requirePermission="false" type="Elmah.ErrorFilterSectionHandler, Elmah" />
</sectionGroup>
</configSections>
<elmah>
<errorFilter>
<test>
<or>
<equal binding="HttpStatusCode" value="404" type="Int32" />
<regex binding="BaseException.Message" pattern="The file '/[^']+' does not exist" />
</or>
</test>
</errorFilter>
<errorLog type="Elmah.XmlFileErrorLog, Elmah" logPath="~/App_Data/logs/elmah" />
</elmah>
<system.web>
<httpModules>
<add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah"/>
<add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah"/>
</httpModules>
</system.web>
<system.webServer>
<modules>
<add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah"/>
<add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />
</modules>
</system.webServer>
</configuration>
【问题讨论】:
第二个链接抛出 404。哦,讽刺... @Baldy 不幸的是,这是一个新的发展。您可以参考我的配置示例了解您的需要。 很好,内森,这个话题很有帮助。我只是觉得有趣的是这个主题是关于 404 的,页面上的一个链接指向 404 :) 【参考方案1】:确实是配置错误,只是不是特别明显。
ELMAH HttpModules 的注册顺序是一个相关问题,因为为了让 ELMAH 过滤异常,它必须首先知道哪些模块将使用异常。 ErrorFilter HttpModule 必须最后注册以防止其他模块处理被过滤的异常。这对我来说似乎 [有点] 倒退,但至少它有效。
<configuration>
...
<system.web>
<httpModules>
<add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah"/>
<add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah"/>
</httpModules>
</system.web>
<system.webServer>
<modules>
<add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />
<add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah"/>
</modules>
</system.webServer>
</configuration>
在再次查看ELMAH Wiki entry on ErrorFiltering 之后,我发现了这个小信息,如果你问我,它确实值得一个 标签。 (编辑:自从我第一次回答这个问题后,他们就加粗了;道具!)
第一步是配置一个名为 Elmah.ErrorFilterModule 的附加模块。确保在 ELMAH 的任何日志记录模块之后添加它,如下所示的 ErrorLogModule:
【讨论】:
以上是关于ELMAH - 过滤 404 错误的主要内容,如果未能解决你的问题,请参考以下文章
ASP.NET MVC - Elmah 不工作并为 elmah.axd 返回 404 页面
懂java进,为啥我在web.xml中配置过滤器,然后就找不到路径了,都是404错误