Windows Workflow Foundation 4(WF4)错误处理

5

如何将WF4工作流中的错误消息传递回托管的ASP.NET MVC应用程序?我需要使工作流不终止,而是继续保持活动状态,然后向托管应用程序传递有关错误的消息,以便用户可以采取替代操作,但我不确定如何实现。

2个回答

6
为了保持您的工作流程正常运行,您需要在工作流程中捕获异常。将TryCatch活动添加到您的工作流程中,在Catch块中,您可以使用Send或自定义活动将数据发送到主机应用程序。
唯一的例外是使用WorkflowApplication.OnUnhandledException和持久性指定abort。在这种情况下,工作流的内存状态仅被删除,并且可以重新加载到最后一个持久状态。如果您选择这种方式,您需要确保使用Perist活动在无法重做的情况下保存您的工作流程。

Maurice,我的工作流目前不是WCF工作流(XAMLX),需要变成WCF工作流才能使用你上面描述的发送活动吗? - Russ Clark
不需要使用Send。任何向主机发送数据的自定义活动都可以。顺便说一下,Send活动使用WCF消息传递,但可以从任何工作流宿主中使用,而Receive活动则需要WorkflowServiceHost。 - Maurice
好的,我已经创建了一个自定义活动,它只是从TryCatch中获取错误消息,然后将其分配给OutArgument,但我不知道如何在我的托管应用程序中获取OutArgument的值。我正在尝试使用WorkflowApplication,因为我还有需要恢复的书签,但我只看到在使用WorkflowInvoker时从工作流程获得输出,然后从中获取输出Dictionary<string,object>。是否有任何方法从WorkflowApplication中获取数据? - Russ Clark
这就是活动跟踪发挥作用的地方。 - James Alexander
自定义活动可以访问范围内的工作流变量。它可以获取所需内容并将其发送到某个地方。可以使用WCF或将其插入到数据库中。它只是另一个活动,可以执行任何您想要的操作,包括等待响应。 - Maurice
显示剩余4条评论

2
在WF4中,TryCatch并不足够。同时,从工作流主机处理UnhandledException事件并不能告诉您哪个活动失败以及原因。
建议的方法是在WF4中使用TryCatch和Activity tracking。这里有一个很好的摘要:http://msmvps.com/blogs/theproblemsolver/archive/2009/11/27/trycatch-activity-in-wf4.aspx 您可以使用跟踪参与者扩展工作流主机,并使用捕获处理程序封装可能导致故障的活动,处理异常并创建新的TrackingRecord,以更好地说明发生了什么。

跟踪扩展仅在您需要知道哪个活动导致错误时才需要。TryCatch 可以很好地捕获错误并告诉您出了什么问题,只是缺少位置信息。 - Maurice
那基本上就是我的观点。我应该表达得更清楚。我正在遭受严重的鼻窦炎困扰,没有好好思考我的回答。 - James Alexander

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接