2

问题

不同应用程序池中我的 2 个工作流服务的 WCF 请求没有被它们各自的工作进程处理。相反,两个工作进程都在处理两个工作流服务的 WCF 请求。此问题仅发生在“集成”托管管道模式中,而不是“经典”托管管道模式中。

设置

  • 2 在 IIS 7.5 中运行的 Worflow 服务 (Workflow Foundation 4.0)。
  • 每个工作流服务都设置为 IIS 中的应用程序,并拥有自己的应用程序池和自己的身份凭据。
  • 应用程序池在“集成”托管管道模式下运行。

描述

例如,我有分别在UserAUserB下运行的工作流服务 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 消息由UserAUserB的 w3wp.exe 工作进程处理。因此,如果我向WFSA发送 10 条 WCF 消息,则 4 条将由 w3wp.exe 为UserA处理,6 条将由 w3wp.exe 为UserB处理。

当我将应用程序池切换到“经典”托管管道模式时,WCF 消息将按预期路由到相应的工作进程。

是否有一些我缺少的配置?

任何帮助是极大的赞赏。

更新

在我正在处理的项目中,WFSAWFSB和另一个 WCF 服务应用程序 ( WCFApp ) 在以下配置中相互通信:

WFSA <==> WFSB <==> WCFApp

我们在以下场景中看到问题:

  • WFSA ==> WFSB ( UserA ):WFSA在WFSB上实例化一个新的工作流,该工作流在 w3wp.exe 上为UserA处理。
  • WFSB ( UserA ) ==> WCFAppWFSB调用WCFApp,它会做一些处理。
  • WCFApp ==> WFSB ( UserB !!!):处理后,WCFApp通知WFSB已完成。但是 WCF 消息由UserB的 w3wp.exe 进程处理!!!当然工作流实例在那里不存在,因此它会出错并显示以下消息:

请求的资源已移动到以下位置之一: http://server/AppFolder/WFSB.xamlx/INotifyWhenDone

我可以通过设置来解决这个问题:

<workflowIdle timeToUnload="00:00:00" />

这意味着工作流在空闲时将立即持久化,并且可以处理发送到错误工作进程的消息,因为它可以在持久性数据库中找到工作流实例。但是,这种解决方案是不可接受的,因为持久性非常慢。

4

2 回答 2

1

AppFabric 有几个热修复程序,其中一个似乎与您遇到的问题有关。在这里寻找链接。

于 2010-11-11T14:21:11.600 回答
0

我感觉这两个服务都在向 IIS 注册类似“标识符”的东西,尽管我不能告诉你这是什么(也许是相关 ID?)。因此,消息被路由到这两个服务。我还觉得在集成管道中只有一个优化的服务管道,并且有多个服务向它注册(这就是我前面观点的原因)。

于 2010-11-11T09:33:15.247 回答