Журнал ELMAH как игнорировать ошибку по типу

Здравствуйте, у меня есть настройка ELMAH в моем проекте, но я получаю много ошибок, например

System.Web.HttpException: потенциально опасное значение Request.Path был обнаружен у клиента (:).

Сгенерировано: Вс, 26 мая 2013 21:46:30 GMT

System.Web.HttpException(0x80004005): потенциально опасный Значение Request.Path было обнаружено у клиента (:). в System.Web.HttpRequest.ValidateInputIfRequiredByConfig() at System.Web.HttpApplication.PipelineStepManager.ValidateHelper(HttpContext контекст)

Я хотел бы игнорировать их и не отправлять на почту, а писать в ELMAH DB. Можно ли это сделать?

Ответы

Ответ 1

Да, вы можете сделать это, используя фильтрацию ошибок в ELMAH и подробно описано в вики проекта. Короче говоря, следующий фильтр в вашем 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> условие фильтры на основе источника фильтрации, так что отправка почты не произойдет. Ознакомьтесь с документацией по вики для получения полной информации.

Ответ 2

Решение, которое не включает регулярные выражения, просто добавьте его в свой файл 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();
}