Задача
Запросы WCF для моих 2 служб Workflow в разных пулах приложений не обрабатываются соответствующими рабочими процессами. Вместо этого оба рабочих процесса обрабатывают запросы WCF для обоих сервисов Workflow. Эта проблема возникает только в «Интегрированном» режиме управляемого конвейера, но не в «Классическом» режиме управляемого конвейера.
Настройка
- 2 Службы Worflow (Workflow Foundation 4.0), работающие в IIS 7.5.
- Каждая служба Workflow настроена как приложение в IIS и имеет собственный пул приложений со своими учетными данными Identity.
- Пулы приложений работают в «Интегрированном» режиме управляемого конвейера.
Описание
Скажем, например, у меня есть Workflow Service A ( WFSA ) и B ( WFSB ), работающие в UserA и UserB соответственно. Они оба ожидают вызовов WCF через действия получения в рабочем процессе.
Когда я запускаю 2 пула приложений, я вижу запущенные 2 рабочих процесса w3wp.exe, один из которых UserA , а другой - UserB . Я ожидаю, что рабочий процесс w3wp.exe для UserA должен обрабатывать запросы WCF для WFSA , а рабочий процесс w3wp.exe для UserB должен обрабатывать запросы WCF для WFSB .
Однако, когда я начинаю отправлять сообщения WCF рабочим процессам, я вижу по файлам трассировки, что оба процесса w3wp.exe обрабатывают запросы для обоих сервисов Workflow.
Например, сообщения WCF для WFSA обрабатываются рабочими процессами w3wp.exe для UserA AND UserB . Поэтому, если я отправлю 10 сообщений WCF на WFSA , 4 будет обработан w3wp.exe для UserA , а 6 будет обработан w3wp.exe для UserB .
Когда я переключаю пул приложений в «классический» режим управляемого конвейера, сообщения WCF направляются соответствующим рабочим процессам, как и ожидалось.
Есть какая-то конфигурация, которую мне не хватает?
Любая помощь очень ценится.
Обновление
В проекте, над которым я работаю, WFSA , WFSB и другое приложение службы WCF ( WCFApp ) обмениваются данными друг с другом в следующей конфигурации :
WFSA <==> WFSB <==> WCFApp
Мы видим проблемы в следующем сценарии:
- WFSA ==> WFSB ( UserA ): WFSA создает новый рабочий процесс на WFSB , который обрабатывается на w3wp.exe для UserA .
- WFSB ( Пользователь A ) ==> WCFApp : WFSB вызывает WCFApp , что делает некоторые обработка.
- WCFApp ==> WFSB ( Пользователь B !!!): После обработки WCFApp уведомляет WFSB что это сделано. Но сообщение WCF обрабатывается процессом w3wp.exe для UserB !!! Конечно, экземпляр рабочего процесса там не существует, поэтому он выдает следующее сообщение:
Запрошенный ресурс перемещен в одно из следующих мест:
http://server/AppFolder/WFSB.xamlx/INotifyWhenDone
Я могу обойти это, установив:
<workflowIdle timeToUnload="00:00:00" />
Это означает, что рабочий процесс будет немедленно сохранен, когда он перейдет в режим ожидания, и сообщения, поступающие в неправильный рабочий процесс, могут быть обработаны, поскольку он может найти экземпляр рабочего процесса в базе данных постоянства. Однако это решение неприемлемо, поскольку постоянство ОЧЕНЬ МЕДЛЕННО.