Elmah没有过滤/拦截web api上的错误

时间:2016-08-16 13:04:17

标签: c# asp.net-web-api elmah

我有一个配置和运行Elmah的Web Api应用程序,正常创建日志。

为了隐藏/删除我尝试this的日志中的敏感数据,但它对我的Web Api控制器不起作用。仅当MVC管道中发生错误时才会触发过滤器(项目中有MVC和Web API控制器)。

我也检查了this问题,但我的配置文件似乎没问题:

    <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>

    [...]

   <location path="." inheritInChildApplications="false">
      <system.web>
          <httpModules>
              <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" />
              <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" />
              <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" />
          </httpModules>
          [..]
      </system.web>
   </location>

   [...]

   <system.webServer>
       <modules runAllManagedModulesForAllRequests="true">
           <add name="ErrorLog" type="Elmah.ErrorLogModule, Elmah" preCondition="managedHandler" />
           <add name="ErrorMail" type="Elmah.ErrorMailModule, Elmah" preCondition="managedHandler" />
           <add name="ErrorFilter" type="Elmah.ErrorFilterModule, Elmah" preCondition="managedHandler" />
       </modules>
  </system.webServer>

Global.asax中的过滤器:

public void ErrorLog_Filtering(object sender, ExceptionFilterEventArgs e)
{
    var ctx = e.Context as HttpContext;

    if (ctx == null) return;

    ElmahDataFilter.Apply(e, ctx);
}

作为附加信息,如果我评论system.web&gt; httpModules部分,日志仍然正常创建。

1 个答案:

答案 0 :(得分:4)

ELMAH没有开箱即用地记录ASP.NET Web API生成的错误。您还需要安装Elmah.Contrib.WebApi软件包:

Install-Package Elmah.Contrib.WebApi

然后配置Web API以在WebApiConfig.cs中将ELMAH用作异常记录器:

config.Services.Add(typeof(IExceptionLogger), new ElmahExceptionLogger());

有关详细信息,请查看我撰写的指南Logging to ELMAH from Web API。在本教程中,您需要将elmah.io包替换为ELMAH,因为您可能正在使用其他错误记录器之一。

我刚刚确认安装这些软件包,实际上会触发您已添加到问题中的ErrorLog_Filtering代码。