Вопрос

У меня есть следующие настройки в моем web.config:

<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>
    <security allowRemoteAccess="0" />
    <errorLog type="Elmah.SqlErrorLog, Elmah" connectionStringName="MyConnHere" />
</elmah>

<system.web>
    <httpHandlers>
        <remove verb="*" path="*.asmx"/>
        <add verb="*" path="*.asmx" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add verb="*" path="*_AppService.axd" validate="false" type="System.Web.Script.Services.ScriptHandlerFactory, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add verb="GET,HEAD" path="ScriptResource.axd" type="System.Web.Handlers.ScriptResourceHandler, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35" validate="false"/>
        <add verb="*" path="*.mvc" validate="false" type="System.Web.Mvc.MvcHttpHandler, System.Web.Mvc, Version=1.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add verb="POST,GET,HEAD" path="elmah.axd" type="Elmah.ErrorLogPageFactory, Elmah" />
    </httpHandlers>
    <httpModules>
        <add name="ScriptModule" type="System.Web.Handlers.ScriptModule, System.Web.Extensions, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add name="UrlRoutingModule" type="System.Web.Routing.UrlRoutingModule, System.Web.Routing, Version=3.5.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
        <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah"/>
        <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" />            
        <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah"/>
    </httpModules>
</system.web>

И следующее в моем файле global.asax:

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

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

private void Filter(ExceptionFilterEventArgs e)
{
    var context = e.Context as HttpContext;

    if (context != null && context.Response.StatusCode == 404)
        e.Dismiss();

    if (e.Exception.GetBaseException() is FileNotFoundException ||
        e.Exception.GetBaseException() is HttpRequestValidationException)
        e.Dismiss();
}

И все же каждый раз, Эльма регистрирует 404 исключения. Я использую ASP.NET MVC; они отображаются как тип System.Web.HttpException, а не исключение FileNotFound, но код состояния по-прежнему 404, поэтому фильтр должен совпадать, но, похоже, он вообще не работает.

Что я делаю не так?

Это было полезно?

Решение

Нашел ответ. Метод Filter должен проверять результат метода HttpException.GetHttpCode (), а не проверять свойство Response.StatusCode.

private void Filter(ExceptionFilterEventArgs e)
{
    var exception = e.Exception.GetBaseException();
    var httpException = exception as HttpException;

    if (httpException != null && 
        httpException.GetHttpCode() == 404)
        e.Dismiss();

    if (exception is FileNotFoundException ||
        exception is HttpRequestValidationException ||
        exception is HttpException)
        e.Dismiss();
}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top