Каков наилучший способ получить сообщения об ошибках из рабочего процесса WF4 обратно в хостинг-приложение ASP.NET MVC? Мне нужно, чтобы рабочий процесс не прерывался, но продолжал быть активным, а затем передавал сообщение хостинговому приложению относительно ошибки, поэтому пользователь может принять альтернативное действие, но я не уверен, как это сделать.Обработка ошибок Windows Workflow Foundation 4 (WF4)
ответ
Чтобы сохранить работоспособность, вы должны поймать исключение в своем рабочем процессе. Добавьте действие TryCatch к вашему рабочему процессу, а в блоке Catch вы можете использовать либо Отправить, либо настраиваемую операцию для отправки данных в хост-приложение.
Единственное исключение - использовать WorkflowApplication.OnUnhandledException с сохранением и указать прерывание. В этом случае состояние памяти в рабочем состоянии просто удаляется, и рабочий процесс может быть перезагружен для последнего сохраняемого состояния. Если вы пойдете так, вам нужно убедиться, что с помощью активности Perist ваш рабочий процесс сохраняется всякий раз, когда что-то невозможно переделать.
Три способа, что я могу думать ...
WorkflowApplication.OnUnhandledException есть, чтобы вы знали, когда необработанное исключение, но я не уверен, если вы можете оправиться от этого. Не похоже на хороший путь, чтобы спуститься.
WorkflowApplication.PersistableIdle позволяет узнать, когда рабочий процесс создал закладку и простаил рабочий процесс. На этом этапе рабочий процесс ждет, когда вы вернетесь с дополнительной информацией, чтобы вернуться в рабочий процесс при возобновлении работы с закладкой. Это может быть вашим лучшим выбором, поскольку его относительно просто реализовать и использовать.
Другой поворот в этом заключается в том, чтобы создать extension, что ваши действия могут получить из контекста рабочего процесса. Расширения предоставляют вам более гибкий способ общения за пределами рабочего процесса, хотя вам нужно их закодировать и убедиться, что они работают должным образом. Bookmark + extension будет вашим самым гибким вариантом.
TryCatch на самом деле недостаточно, когда дело доходит до WF4. Кроме того, обработка события UnhandledException из вашего узла рабочего процесса на самом деле не говорит вам о том, какая активность не удалась и почему.
Предлагаемый подход заключается в использовании TryCatch и отслеживания активности в WF4. Хорошее резюме этого можно найти здесь: http://msmvps.com/blogs/theproblemsolver/archive/2009/11/27/trycatch-activity-in-wf4.aspx
Вы можете расширить хост рабочего процесса участниками отслеживания и обработчиком захвата, который инкапсулирует вашу деятельность, которая может быть ошибкой, обработать исключение и создать новый TrackingRecord, который может лучше проиллюстрировать, что получилось.
Расширение отслеживания требуется только в том случае, если вам нужно знать, какая активность вызвала ошибку. TryCatch будет очень хорошо разбираться в ошибке и сообщать вам, что пошло не так, и только там, где это отсутствует. – Maurice
Это было более или менее мое мнение. Я должен был быть более ясным. Страдая от нечестивой инфекции синуса, я не думал, что мой ответ слишком ясен. –
Maurice, мой рабочий процесс в настоящее время не является рабочим процессом WCF (XAMLX), нужно ли использовать операцию отправки, описанную выше? –
Нет необходимости использовать Отправить. Любая пользовательская активность, отправляющая данные на хост, прекрасна. BTW В операции «Отправить» используется обмен сообщениями WCF, но может использоваться с любого хоста рабочего процесса, его актив приема, который требует WorkflowServiceHost. – Maurice
ОК, я создал настраиваемое действие, которое просто получает сообщение об ошибке из TryCatch, а затем назначает его OutArgument, но я не вижу, как получить значение OutArgument в моем приложении для хостинга. Я пытаюсь использовать WorkflowApplication, так как у меня также есть закладки, которые нужно возобновить, но я видел только выход из рабочего процесса при использовании WorkflowInvoker, а затем возвращаю из него выходной словарь. Есть ли способ вернуть данные из WorkflowApplication? –