Странное исключение в WF при использовании SqlWorkflowPersistenceService & SqlTrackingService - PullRequest
0 голосов
/ 26 августа 2009

Я запускаю среду выполнения рабочего процесса, которая содержит SqlWorkflowPersistenceService & SqlTrackingService (с IsTransactional = true)

WorkflowInstance workflowInstance = _workflowRuntime.CreateWorkflow(workflowType);
workflowInstance.Start();

// Assure persistence
workflowInstance.Unload(); // Error occur here
workflowInstance.Load();

Я получаю ошибку:

PersistenceException "Cannot access a disposed object.\r\nObject name: 'Transaction'."
   at System.Workflow.Runtime.WorkflowExecutor.Persist(Activity dynamicActivity, Boolean unlock, Boolean needsCompensation)
   at System.Workflow.Runtime.WorkflowExecutor.PerformUnloading(Boolean handleExceptions)
   at System.Workflow.Runtime.WorkflowExecutor.Unload()
   at System.Workflow.Runtime.WorkflowInstance.Unload()

Все работает нормально, если я не добавляю SqlTrackingService или не устанавливаю значение IsTransactional в true


Редактировать: Эта ошибка возникает только при использовании удаленной базы данных. Точно такой же код будет работать при выполнении его с компьютера базы данных.

Ответы [ 2 ]

1 голос
/ 13 сентября 2009

Проблема решена.

SharedConnectionWorkflowCommitWorkBatchService не был ответом. Использование было только частичным решением, потому что:

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

Реальная проблема - DTC был отключен
Начиная с Windows XP SP2, сетевой доступ для MSDTC (координатор распределенных транзакций Microsoft) по умолчанию отключен.

Как это исправить - включить сетевой доступ для MSDTC:

  1. Меню Пуск -> Программы -> Администрирование -> Службы компонентов
  2. Корень консоли -> Службы компонентов -> Компьютеры -> Мой компьютер -> щелкните его правой кнопкой мыши и выберите Свойства.
  3. Выберите MSDTC и нажмите Конфигурация безопасности.
  4. Включить «Доступ по DTC по сети», «Разрешить удаленных клиентов», «Разрешить удаленное администрирование», «Разрешить входящие», «Разрешить исходящие», «Включить транзакции TIP» и «Включить транзакции XA».
  5. Подтвердите все изменения и закройте окно.
  6. Если вы запускаете брандмауэр Windows, вам следует открыть исключение для MSDTC. Перейдите в «Панель управления» -> «Центр безопасности» -> «Брандмауэр Windows» -> «Исключения» -> «Добавить программу» -> «Обзор» и выберите «C: \ WINDOWS \ system32 \ msdtc.exe». Подтвердите все изменения.
1 голос
/ 26 августа 2009

Я не видел эту ошибку раньше, но кое-что, что может помочь в отладке, это настройка IsTransactional. Это имя немного вводит в заблуждение и на самом деле означает пакетные обновления базы данных, пока не будет достигнута точка сохранения. Когда вызывается UnLoad (), это точка сохранения, а при IsTransactional = true все записи отслеживания будут сохраняться. Когда IsTransactional = false, они сохраняются сразу после их создания.

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

...