Как мне обрабатывать прием вызовов, сделанных не по порядку?

У меня есть служба WF4, которая эмулирует воронку продаж. Он работает, начиная с приема вызова «Регистрация». После этого следуют 10 подобных этапов (состоящих из 2 приемов на каждом этапе). Вы не можете продвинуться дальше этапа, пока текущий этап не проверит полученные данные. В чем я не уверен, так это в том, что даже если мое клиентское приложение не позволит этого, как я могу сделать так, чтобы мой рабочий процесс не позволял никому вызывать операции приема не по порядку? В моем тестовом консольном приложении я позволяю пользователю вызывать любую операцию приема (просто потому, что я хотел посмотреть, что произойдет).

Например, если я сначала вызываю Register, а затем получаю «AddQualification» перед получением «AddProspect», тестовое приложение возвращается с таким исключением:

Operation 'AddQualification|{http://tempuri.org/}IZSalesFunnelService' on service instance with identifier '1984c927-402b-4fbb-acd4-edfe4f0d8fa4' cannot be performed at this time. Please ensure that the operations are performed in the correct order and that the binding in use provides ordered delivery guarantees

Из этого вытекают 2 вещи, которые я не знаю, как сделать:

Во-первых, как мне обработать исключение ошибки, чтобы осмысленно уведомить клиента и...

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

Есть предположения?


person Thelonias    schedule 25.02.2011    source источник


Ответы (2)


Что касается вашего первого вопроса, я бы посмотрел сообщение Рори Примроуз о том, как защитить ошибки корреляции контента: Управление ошибками корреляции контента. Здесь он переводит исключение в действительное бизнес-исключение.

person Kristian Kristensen    schedule 25.02.2011
comment
Эта ссылка не работает с тех пор, как вы ее отправили... есть ли другой источник той же информации? - person Thelonias; 28.02.2011
comment
О да, я понял. Итак, в основном вам нужно где-то реализовать IErrorHandler, и в этой проверке на выбрасываемое исключение. Затем проверьте FaultException и его код пространства имен для schemas.datacontract.org/2008/10/WorkflowServices. Возможно, вы захотите проверить пост Рона Джейкоба. - person Kristian Kristensen; 02.03.2011
comment
Исходная ссылка, похоже, снова активна: Управление контентом Ошибки корреляции - person Kristian Kristensen; 11.03.2011

Извините, мой сервер немного перегружен, поэтому блог временно не выходит в эфир.

Что касается вашего второго вопроса, вам необходимо убедиться, что для вашей службы рабочего процесса установлено значение «Отказаться от необработанных исключений». Вот документ для AppFabric для этой настройки:


Покидать. Хост службы прерывает экземпляр службы рабочего процесса в памяти. Состояние экземпляра в базе данных остается «Активный». Служба управления рабочим процессом восстанавливает заброшенный экземпляр рабочего процесса из последней точки сохраняемости, сохраненной в базе данных сохраняемости.

Отказаться и приостановить. Хост службы прерывает экземпляр службы рабочего процесса в памяти и устанавливает состояние экземпляра в базе данных постоянства на «Приостановлено». Приостановленный экземпляр можно возобновить или остановить позже с помощью диспетчера IIS. Эти экземпляры не восстанавливаются службой управления рабочим процессом автоматически.

Прекратить. Хост службы прерывает экземпляр службы рабочего процесса в памяти и устанавливает состояние экземпляра в базе данных постоянства на «Завершено (прекращено)». Прекращенный экземпляр нельзя возобновить позже.

Отмена. Хост службы отменяет экземпляр службы рабочего процесса, вызывая вызов всех обработчиков отмены, чтобы рабочий процесс завершался изящным образом, и устанавливает состояние экземпляра в базе данных постоянства на «Завершено (отменено)».


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

Надеюсь это поможет.

person Rory Primrose    schedule 14.03.2011