Как использовать WF DelayActivity в веб-процессе ASP.Net - PullRequest
0 голосов
/ 16 сентября 2009

У меня есть веб-приложение, в которое я добавляю функциональность рабочего процесса в Windows Workflow Foundation. Я основал свое решение на примере Orders Workflow K. Scott Allen на OdeToCode. В начале я не осознавал значение предостережения «если вы используете действия« Задержка »и настраиваете активные таймеры для службы ручного планирования, эти события будут происходить в фоновом потоке, который не связан с HTTP-запросом». Теперь мне нужно использовать действия «Задержка», и это не работает, как с его архитектурой решения. Кто-нибудь сталкивался с этим и нашел для этого хорошее решение? Пример связан со многими местами, но я не видел, чтобы кто-нибудь еще сталкивался с этой проблемой, и это кажется чем-то вроде пробки для шоу.

Редактировать: проблема в том, что результаты рабочего процесса возвращаются в веб-приложение через HttpContext. Я использую ManualWorkflowSchedulerService с useActiveTimers, и это прекрасно работает для большинства ситуаций, потому что события рабочего процесса запускаются из веб-приложения, и HttpContext все еще существует, когда возвращаются результаты рабочего процесса и веб-приложение может продолжить обработку. Когда используется операция задержки, обработка происходит в фоновом потоке и когда он пытается вернуть результаты в веб-приложение, отсутствует действительный HttpContext (поскольку не было запроса Http), поэтому дальнейшая обработка завершается неудачно. То есть веб-приложение пытается обработать результаты рабочего процесса, но не было http-запроса.

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

Приветствие.

1 Ответ

0 голосов
/ 16 сентября 2009

Вы не описали проблему, с которой столкнулись. Но, возможно, это поможет.

Вы можете использовать ManualWorkflowSchedulerService с useActiveTimers, и рабочий процесс будет продолжен в другом потоке. Обычно это нормально, потому что ваш HTTP-запрос уже завершен, и это не имеет значения.

Если, однако, вам необходим полный контроль, среда выполнения рабочего процесса позволит вам получить дескриптор всех загруженных рабочих процессов с помощью функции GetLoadedWorkflows (). Это вернет сбор объектов WorkflowInstance. Используя их, вы можете вызвать GetWorkflowNextTimerExpiration (), чтобы проверить, какой срок действия истек. Если это так, вы можете возобновить его вручную. В этом случае вы хотите использовать ManualWorkflowSchedulerService с useActiveTimers = false, чтобы вы также могли контролировать последний поток. Однако в большинстве случаев использование useActiveTimers = true работает отлично.

...