5

Каков наилучший способ получить сообщения об ошибках из рабочего процесса WF4 обратно в хостинг-приложение ASP.NET MVC? Мне нужно, чтобы рабочий процесс не прерывался, но продолжал быть активным, а затем передавал сообщение хостинговому приложению относительно ошибки, поэтому пользователь может принять альтернативное действие, но я не уверен, как это сделать.Обработка ошибок Windows Workflow Foundation 4 (WF4)

ответ

6

Чтобы сохранить работоспособность, вы должны поймать исключение в своем рабочем процессе. Добавьте действие TryCatch к вашему рабочему процессу, а в блоке Catch вы можете использовать либо Отправить, либо настраиваемую операцию для отправки данных в хост-приложение.

Единственное исключение - использовать WorkflowApplication.OnUnhandledException с сохранением и указать прерывание. В этом случае состояние памяти в рабочем состоянии просто удаляется, и рабочий процесс может быть перезагружен для последнего сохраняемого состояния. Если вы пойдете так, вам нужно убедиться, что с помощью активности Perist ваш рабочий процесс сохраняется всякий раз, когда что-то невозможно переделать.

+0

Maurice, мой рабочий процесс в настоящее время не является рабочим процессом WCF (XAMLX), нужно ли использовать операцию отправки, описанную выше? –

+0

Нет необходимости использовать Отправить. Любая пользовательская активность, отправляющая данные на хост, прекрасна. BTW В операции «Отправить» используется обмен сообщениями WCF, но может использоваться с любого хоста рабочего процесса, его актив приема, который требует WorkflowServiceHost. – Maurice

+0

ОК, я создал настраиваемое действие, которое просто получает сообщение об ошибке из TryCatch, а затем назначает его OutArgument, но я не вижу, как получить значение OutArgument в моем приложении для хостинга. Я пытаюсь использовать WorkflowApplication, так как у меня также есть закладки, которые нужно возобновить, но я видел только выход из рабочего процесса при использовании WorkflowInvoker, а затем возвращаю из него выходной словарь . Есть ли способ вернуть данные из WorkflowApplication? –

-1

Три способа, что я могу думать ...

WorkflowApplication.OnUnhandledException есть, чтобы вы знали, когда необработанное исключение, но я не уверен, если вы можете оправиться от этого. Не похоже на хороший путь, чтобы спуститься.

WorkflowApplication.PersistableIdle позволяет узнать, когда рабочий процесс создал закладку и простаил рабочий процесс. На этом этапе рабочий процесс ждет, когда вы вернетесь с дополнительной информацией, чтобы вернуться в рабочий процесс при возобновлении работы с закладкой. Это может быть вашим лучшим выбором, поскольку его относительно просто реализовать и использовать.

Другой поворот в этом заключается в том, чтобы создать extension, что ваши действия могут получить из контекста рабочего процесса. Расширения предоставляют вам более гибкий способ общения за пределами рабочего процесса, хотя вам нужно их закодировать и убедиться, что они работают должным образом. Bookmark + extension будет вашим самым гибким вариантом.

2

TryCatch на самом деле недостаточно, когда дело доходит до WF4. Кроме того, обработка события UnhandledException из вашего узла рабочего процесса на самом деле не говорит вам о том, какая активность не удалась и почему.

Предлагаемый подход заключается в использовании TryCatch и отслеживания активности в WF4. Хорошее резюме этого можно найти здесь: http://msmvps.com/blogs/theproblemsolver/archive/2009/11/27/trycatch-activity-in-wf4.aspx

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

+0

Расширение отслеживания требуется только в том случае, если вам нужно знать, какая активность вызвала ошибку. TryCatch будет очень хорошо разбираться в ошибке и сообщать вам, что пошло не так, и только там, где это отсутствует. – Maurice

+0

Это было более или менее мое мнение. Я должен был быть более ясным. Страдая от нечестивой инфекции синуса, я не думал, что мой ответ слишком ясен. –