【问题标题】:Elmah library error handling within WebAPI 2WebAPI 2 中的 Elmah 库错误处理
【发布时间】:2015-07-02 09:58:30
【问题描述】:

我已经为 Elmah.WebApi 和 elmah.Mvc 安装了 nuget 包,它发现了我的很多错误。但是我有一个并行的 foreach 循环,它抛出一个错误并且没有被 elmah 捕获/记录。

我假设 nuget 包将实现此处指定的类和接口:http://www.asp.net/web-api/overview/error-handling/web-api-global-error-handling

是否需要应用额外的过滤器来捕获不同线程中发生的错误?我猜在使用 async/await 时也是如此?

这是我的代码:

Parallel.ForEach(serviceHeaders, new ParallelOptions() { MaxDegreeOfParallelism = 8 }, patientGroup =>
{
    ...
}

【问题讨论】:

  • 返回后好像出现异常。你如何运行你的“并行循环”?它是使用await 还是在线程池中排队?如果你排队,Elmah 不会抓住它。
  • 嗨,benjamin,我已经添加了运行并行循环的方式。我认为错误会通过调用方法等重新冒泡并被 elmah 捕获。不是这样吗?

标签: c# asp.net-web-api2 elmah elmah.mvc


【解决方案1】:

如果您在 Web API 中将 Elmah 注册为 IExceptionLogger(可能由 Nuget 包自动完成),则需要当前主线程的 HttpContext。一旦该上下文消失,即您返回客户端,就不会再捕获任何异常。

您也许可以在没有请求上下文的情况下将 Elmah 用于 manual logging,但解决此问题的正确方法是使用分布式系统,例如 Azure WebJobs、队列/消息传递系统等。

如果您不想走那么远,最好等待异步操作,Elmah 会捕获异常。

更多信息here

【讨论】:

    【解决方案2】:

    结果表明 elmah 确实捕获了并行线程中引发的错误。每个错误都会添加到 AggregateException,因为理论上每个线程都可以同时抛出错误。更多信息可以在这里找到:https://msdn.microsoft.com/en-us/library/dd460695(v=vs.110).aspx

    但是,我遇到的问题与我的问题完全无关!

    【讨论】:

      猜你喜欢
      • 2016-03-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-07
      • 1970-01-01
      • 1970-01-01
      • 2012-11-04
      • 1970-01-01
      相关资源
      最近更新 更多