如何处理无序的“接收”呼叫?

时间:2011-02-25 18:38:57

标签: wcf workflow-foundation-4 workflowservice

我有一个模拟销售渠道的WF4服务。它的工作原理是从“注册”接收呼叫开始。之后,有10个类似的阶段(每个阶段包括2个接收)。在当前阶段验证收到的数据之前,您无法超越某个阶段。我不确定的是,即使我的客户端应用程序不允许,我怎样才能使我的工作流程阻止任何人无序地调用接收操作?在我的测试控制台应用程序中,我让用户调用任何接收操作(只是因为我想看看会发生什么)。

例如,如果我首先调用Register,然后在收到“AddProspect”之前收到“AddQualification”,则测试应用程序将返回如下例外:

此时无法执行标识为“1984c927-402b-4fbb-acd4-edfe4f0d8fa4”的服务实例上的“AddQualification | {http://tempuri.org/} IZSalesFunnelService”操作。请确保以正确的顺序执行操作,并确保使用中的绑定提供有序的交付保证

有两件事我不知道怎么做:

首先,我如何处理故障异常以有意义的方式通知客户端...

其次,因为我正在使用持久性(和属性提升),当我进行无序调用时,提升的属性会被卸载。在客户端获得异​​常后,它们不会再次被提升。

有什么想法吗?

2 个答案:

答案 0 :(得分:4)

抱歉,我的服务器正在播放一点,所以博客暂时停止播出。

关于第二个问题,您需要确保将工作流服务设置为Abandon以处理未处理的异常。以下是适用于此设置的AppFabric的doco:


放弃。服务主机中止内存中的工作流服务实例。数据库中实例的状态仍为“活动”。工作流管理服务从保留在持久性数据库中的上一个持久性点恢复已放弃的工作流实例。

放弃并暂停。服务主机中止内存中的工作流服务实例,并将持久性数据库中实例的状态设置为“Suspended”。通过使用IIS管理器,可以稍后恢复或终止挂起的实例。工作流管理服务不会自动恢复这些实例。

终止。服务主机中止内存中的工作流服务实例,并将持久性数据库中实例的状态设置为“已完成(已终止)”。终止的实例以后无法恢复。

取消。服务主机取消工作流服务实例,从而调用所有取消处理程序,以便工作流以正常方式终止,并将持久性数据库中实例的状态设置为“已完成(已取消)”。


Abandon是唯一可以保留在持久性存储中的工作流的设置,以便您可以再次调用它。

希望这有帮助。

答案 1 :(得分:3)

关于你的第一个问题,我会看看Rory Primroses关于如何屏蔽内容关联失败的帖子:Managing Content Correlation Failures。在这里,他将异常转换为有效的业务异常。