问题
不同应用程序池中我的 2 个工作流服务的 WCF 请求没有被它们各自的工作进程处理。相反,两个工作进程都在处理两个工作流服务的 WCF 请求。此问题仅发生在“集成”托管管道模式中,而不是“经典”托管管道模式中。
设置
- 2 在 IIS 7.5 中运行的 Worflow 服务 (Workflow Foundation 4.0)。
- 每个工作流服务都设置为 IIS 中的应用程序,并拥有自己的应用程序池和自己的身份凭据。
- 应用程序池在“集成”托管管道模式下运行。
描述
例如,我有分别在UserA和UserB下运行的工作流服务 A ( WFSA ) 和 B ( WFSB ) 。他们都期望通过工作流中的接收活动调用 WCF。
当我启动 2 个应用程序池时,我可以看到 2 个 w3wp.exe 工作进程正在运行,一个作为UserA,另一个作为UserB。我希望UserA的 w3wp.exe 工作进程应该处理WFSA的 WCF 请求,而UserB的 w3wp.exe 工作进程应该处理WFSB的 WCF 请求。
但是,当我开始向工作流发送 WCF 消息时,我可以通过跟踪日志文件看到两个 w3wp.exe 进程正在处理两个工作流服务的请求。
例如,WFSA的 WCF 消息由UserA和UserB的 w3wp.exe 工作进程处理。因此,如果我向WFSA发送 10 条 WCF 消息,则 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 ( UserA ) ==> WCFApp:WFSB调用WCFApp,它会做一些处理。
- WCFApp ==> WFSB ( UserB !!!):处理后,WCFApp通知WFSB已完成。但是 WCF 消息由UserB的 w3wp.exe 进程处理!!!当然工作流实例在那里不存在,因此它会出错并显示以下消息:
请求的资源已移动到以下位置之一: http://server/AppFolder/WFSB.xamlx/INotifyWhenDone
我可以通过设置来解决这个问题:
<workflowIdle timeToUnload="00:00:00" />
这意味着工作流在空闲时将立即持久化,并且可以处理发送到错误工作进程的消息,因为它可以在持久性数据库中找到工作流实例。但是,这种解决方案是不可接受的,因为持久性非常慢。