16

您好,我已经在我的项目中设置了 ELMAH,但是我遇到了很多错误,例如

System.Web.HttpException:从客户端 (:) 检测到潜在危险的 Request.Path 值。

生成时间:2013 年 5 月 26 日星期日 21:46:30 GMT

System.Web.HttpException (0x80004005):从客户端 (:) 检测到潜在危险的 Request.Path 值。在 System.Web.HttpRequest.ValidateInputIfRequiredByConfig() 在 System.Web.HttpApplication.PipelineStepManager.ValidateHelper(HttpContext 上下文)

我想忽略它们,不要发送到我的邮件,而是写在 ELMAH DB 中。有可能吗?

4

2 回答 2

21

是的,您可以使用ELMAH中的错误过滤来执行此操作,项目 wiki 对此进行了详细描述。简而言之,您web.config应该使用以下过滤器(假设您已经设置了模块配置部分):

<errorFilter>
    <test>
        <and>
            <regex binding="FilterSourceType.Name" pattern="mail" />
            <regex binding="Exception.Message" 
               pattern="(?ix: \b potentially \b.+?\b dangerous \b.+?\b value \b.+?\b detected \b.+?\b client \b )" />
        </and>
    </test>
</errorFilter>

第一个<regex>条件基于过滤源进行过滤,以便不会发生邮件。查看 wiki 上的文档以获取完整的详细信息

于 2013-05-27T16:34:45.630 回答
18

不涉及正则表达式的解决方案,只需将其添加到您的 Global.asax.cs:

protected void ErrorMail_Filtering(object sender, ExceptionFilterEventArgs e)
{
    if (e.Message == "A potentially dangerous Request.Path value was detected from the client (:).")
        e.Dismiss();
}

// this method may also be useful
protected void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e)
{
    if (e.Message == "A potentially dangerous Request.Path value was detected from the client (:).")
    {
        // do something
    }
}

或者你可以结合这两种方法:

void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs args)
{
    Filter(args);
}

void ErrorMail_Filtering(object sender, ExceptionFilterEventArgs args)
{
    Filter(args);
}

void Filter(ExceptionFilterEventArgs args)
{
    if (args.Exception.GetBaseException() is HttpRequestValidationException)
        args.Dismiss();
}
于 2014-03-14T12:52:45.713 回答