2015-07-02 1 views
0

Я установил пакет nuget для Elmah.WebApi и elmah.Mvc, который ломает много моих ошибок. Однако у меня есть параллельный цикл foreach, который вызывает ошибку и не попадает/регистрируется elmah.Обработка ошибок Elmah WebAPI 2

Я предположил, что пакеты NuGet будут реализовывать классы и интерфейсы, указанные здесь: http://www.asp.net/web-api/overview/error-handling/web-api-global-error-handling

Есть ли дополнительный фильтр необходимо применить, чтобы поймать ошибки, которые происходят в отдельных потоках? Я предполагаю, что это же касается использования async/wait?

Любая помощь или руководство ценится

Edit (добавлен код)

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

Звучит как исключение происходит после возвращения. Как вы запускаете свой «параллельный цикл»? Использует ли это 'await' или вы ставите очередь в пуле потоков? Если вы окажетесь в очереди, Эльма не поймает его. –

+0

Привет, benjamin, я добавил, как я запускаю параллельный цикл. Я думал, что ошибка будет пузыриться обратно через вызывающие методы и т. Д. И быть пойманным elmah. Разве это не так? – Phil

ответ

1

Если вы зарегистрируетесь Elmah в Web API как IExceptionLogger (вероятно, сделано автоматически с помощью пакета NuGet), он требует HttpContext текущей основной нити. Как только этот контекст исчезнет, ​​т. Е. Вы вернетесь к клиенту, никаких исключений не будет.

Вы можете быть в состоянии использовать Elmah для manual logging без контекста запроса, но правильный способ решения этой проблемы является использование распределенных систем, таких как Azure WebJobs, очереди/системы обмена сообщений и т.д.

Если вы не хочу пойти так далеко, лучше будет ждать асинхронных операций, и Эльма поймает исключения.

Дополнительная информация here.

0

Оказывается, что elmah захватывает ошибки, возникающие в параллельных потоках. Каждая ошибка добавляется в AggregateException, поскольку каждый поток может теоретически допускать ошибки одновременно. Более подробную информацию можно найти здесь: https://msdn.microsoft.com/en-us/library/dd460695(v=vs.110).aspx

Однако проблема, с которой я сталкиваюсь, является чем-то совершенно не связанным с моим вопросом!