2

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

例如,如果我先调用 Register,然后在“AddProspect”接收之前接收“AddQualification”,则测试应用程序会返回如下异常:

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

两件事来自于此,我不知道该怎么做:

首先,我如何处理错误异常以有意义的方式通知客户端并且......

其次,因为我正在使用持久性(和属性提升),所以当我进行无序调用时,提升的属性会卸载。客户收到异常后,他们不会再次升级。

有什么想法吗?

4

2 回答 2

4

抱歉,我的服务器有点忙,所以博客暂时停播。

关于您的第二个问题,您需要确保您的工作流服务设置为放弃未处理的异常。这是此设置的 AppFabric 的文档:


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

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

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

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


Abandon is the only setting that will hold onto your workflow in the persistence store so that you can then call it again.

Hope this helps.

于 2011-03-14T01:45:03.007 回答
3

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

于 2011-02-25T19:39:49.610 回答