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

Jea*_*nço 3 c# elmah asp.net-web-api

我有一个配置了 Elmah 并正常工作的 Web Api 应用程序,日志正常创建。

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

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

    <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>
Run Code Online (Sandbox Code Playgroud)

Global.asax 中的过滤器:

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

    if (ctx == null) return;

    ElmahDataFilter.Apply(e, ctx);
}
Run Code Online (Sandbox Code Playgroud)

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

Tho*_*dal 5

ELMAH 不会立即记录由 ASP.NET Web API 生成的错误。您还需要安装 Elmah.Contrib.WebApi 包:

Install-Package Elmah.Contrib.WebApi
Run Code Online (Sandbox Code Playgroud)

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

config.Services.Add(typeof(IExceptionLogger), new ElmahExceptionLogger());
Run Code Online (Sandbox Code Playgroud)

有关更多信息,请查看我编写的从 Web API 登录到 ELMAH的指南。在本教程中,你将需要更换elmah.io包ELMAH,因为你很可能使用其他错误记录器之一。

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