我已经为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 =>
{
...
}
答案 0 :(得分:1)
如果您将Web API中的Elmah注册为IExceptionLogger
(可能由Nuget包自动完成),则需要当前主线程的HttpContext
。一旦上下文消失,即您返回客户端,就不会再捕获异常。
您可以在没有请求上下文的情况下将Elmah用于manual logging,但解决此问题的正确方法是使用分布式系统,例如Azure WebJobs,队列/消息系统等。
如果你不想走那么远,最好等待异步操作,Elmah会捕获异常。
更多信息here。
答案 1 :(得分:0)
事实证明,elmah确实捕获了并行线程中引发的错误。每个错误都会添加到AggregateException,因为理论上每个线程可以同时抛出错误。更多信息可以在这里找到:https://msdn.microsoft.com/en-us/library/dd460695(v=vs.110).aspx
但是,我遇到的问题与我的问题完全无关!