Запретить прерывание экземпляра рабочего процесса при возникновении исключения в TransactedReceiveScope

#c# #.net #wcf #workflow-foundation-4

#c# #.net #wcf #workflow-foundation-4

Вопрос:

У нас есть последовательная служба рабочего процесса WCF (двунаправленная, XAML, размещенная в IIS), которая выполняет несколько вызовов других служб WCF (которые не обязательно являются рабочими процессами), которые выполняют транзакционные операции в TransactedReceiveScope. Мы столкнулись с проблемой, которая, по нашему мнению, каким-то образом связана с тем фактом, что вы не можете легко установить значение флага AbortInstanceOnTransactionFailure, как вы делаете с активностью TransactionScope.

Всякий раз, когда возникает исключение на одном из нижних уровней нашей архитектуры (архитектура SOA; мы создали пользовательскую реализацию интерфейса IErrorHandler, чтобы передавать исключения по мере их возникновения в службах WCF, и сумели перехватить их в клиентских приложениях, используя обычные блоки try / catch в стиле C #, а нечем использовать контракты ошибок) и правильно перехватывается в рамках любого из пользовательских (производных от CodeActivity activity) транзакционных действий, которые включают всю область транзакции, внешняя транзакция прерывается, что приводит к прерыванию экземпляра рабочего процесса.

То, что мы хотим сделать, это перенести исключение на уровень клиента (уровень API) и позволить нашему маршалу выполнить обработку, как с нижними уровнями (десериализовать сведения об ошибке и преобразовать их в объект исключения), вместо того, чтобы получать общее сообщение «Рабочий процесс прерван». сообщение об ошибке без какой-либо дополнительной информации о нем.

Кто-нибудь сталкивался с подобной проблемой или имеет какие-либо идеи о том, что можно сделать, чтобы предотвратить прерывание рабочего процесса при прерывании транзакции?

Мы повсюду искали ответы, и этот поток — единственный, который приближается к нашей проблеме:

https://social.msdn.microsoft.com/Forums/vstudio/en-US/d068c57e-11bf-4e0c-9544-75ede23c329e/how-do-we-make-the-original-exception-bubble-to-the-client-of-a-wcf-workflow-containing-a

Подробности о реализации маршалинга исключений:

https://web.archive.org/web/20081118071929/http://www.olegsych.com/2008/07/simplifying-wcf-using-exceptions-as-faults/

Стоит отметить, что то же самое поведение применяется для служб WCF workflow с использованием декларативного подхода (через файлы * .config), так что до реализации транзакционной активности в наших рабочих процессах это работало так, как ожидалось.

Заранее спасибо.

Комментарии:

1. Как бы то ни было, я придерживаюсь философии захвата исключений на границе службы, а не передачи их клиенту. Но я могу понять, как у вас сложная служба в WF, у которой есть свои проблемы, которые могут не относиться к стандартным шаблонам проектирования WCF.