【发布时间】:2023-03-09 13:29:01
【问题描述】:
问题
我在不同应用程序池中的 2 个工作流服务的 WCF 请求没有被它们各自的工作进程处理。相反,两个工作进程都在处理两个工作流服务的 WCF 请求。此问题仅在“集成”托管管道模式下出现,而不在“经典”托管管道模式下出现。
设置
- 2 在 IIS 7.5 中运行的 Worflow 服务 (Workflow Foundation 4.0)。
- 每个工作流服务都设置为 IIS 中的应用程序,并拥有自己的应用程序池和自己的身份凭据。
- 应用程序池在“集成”托管管道模式下运行。
说明
比如说,我有工作流服务 A (WFSA) 和 B (WFSB) 在 UserA 和 下运行分别是用户B。他们都期望通过工作流中的 Receive 活动调用 WCF。
当我启动 2 个应用程序池时,我可以看到 2 个 w3wp.exe 工作进程正在运行,一个作为 UserA,另一个作为 UserB。我希望 UserA 的 w3wp.exe 工作进程应该处理 WFSA 的 WCF 请求,而 UserB 的 w3wp.exe 工作进程应该处理 WCF 请求对于WFSB。
但是,当我开始向工作流发送 WCF 消息时,我可以通过跟踪日志文件看到两个 w3wp.exe 进程都在处理两个工作流服务的请求。
例如,WFSA 的 WCF 消息正在由 UserA 和 UserB 的 w3wp.exe 工作进程处理。因此,如果我向 WFSA 发送 10 条 WCF 消息,其中 4 条将由 UserA 的 w3wp.exe 处理,而 6 条将由 UserB。
当我将应用程序池切换到“经典”托管管道模式时,WCF 消息会按预期路由到相应的工作进程。
我缺少一些配置吗?
非常感谢任何帮助。
更新
在我正在进行的项目中,WFSA、WFSB 和另一个 WCF 服务应用程序 (WCFApp) 在如下配置:
WFSA WFSB WCFApp
我们在以下场景中看到问题:
- WFSA ==> WFSB (UserA):WFSA 在 WFSB上实例化一个新的工作流>,在 w3wp.exe 上为 UserA 处理。
- WFSB (UserA) ==> WCFApp:WFSB 调用 WCFApp,它做一些处理。
- WCFApp ==> WFSB (UserB!!!):处理完毕后,WCFApp通知WFSB 完成了。但是 WCF 消息由 UserB 的 w3wp.exe 进程处理!!!当然工作流实例在那里不存在,因此它会出错并显示以下消息:
请求的资源已移至以下位置之一: http://server/AppFolder/WFSB.xamlx/INotifyWhenDone
我可以通过设置来解决这个问题:
<workflowIdle timeToUnload="00:00:00" />
这意味着工作流在空闲时会立即持久化,并且可以处理发送到错误工作进程的消息,因为它可以在持久性数据库中找到工作流实例。但是,这种解决方案是不可接受的,因为持久性非常慢。
【问题讨论】:
标签: workflow-foundation-4 iis-7.5 workflowservice