无法从实例存储加载更新的活动

时间:2013-07-19 14:00:27

标签: .net workflow-foundation-4

我一直在一个相当复杂的系统中恢复工作流程的错误所困扰,到目前为止很难找到解决方案。

恢复工作流程时发生错误。工作流程和活动已更改,但存在不应影响该版本的版本控制。恢复操作会显示旧版本的xaml文件,并调用这些活动的旧版本,并且已经运行了一年。

开始测试新版本的系统,突然我收到此错误: 在实例存储中找到了实例'some guid',但该实例不是工作流实例

这发生在Worklfow的Resume方法中,特别是在这一行中:

application.Load(resumeContext.WorkflowInstanceId);

在数据库中,我可以找到带有Guid的实例,看起来没问题,所以我无法理解它为什么不加载。

我在整个谷歌中发现只有one page出现此错误且没有答案,所以这就是那里的沙漠。

堆栈跟踪无用:

Exception: System.Exception: Exception of type 'System.Exception' was thrown.

   at System.Activities.WorkflowApplication.ExtractRuntimeState(IDictionary`2 values, Guid instanceId)
   at System.Activities.WorkflowApplication.ProcessInstanceValues(IDictionary`2 values, Object& deserializedRuntimeState)
   at System.Activities.WorkflowApplication.LoadCore(DynamicUpdateMap updateMap, TimeoutHelper timeoutHelper, Boolean loadAny, IDictionary`2 values)
   at System.Activities.WorkflowApplication.Load(Guid instanceId, TimeSpan timeout)
   at System.Activities.WorkflowApplication.Load(Guid instanceId)
   at Project.TS.Services.Workflows.Hosting.ActivityInvoker.Resume[TResponse](WorkflowApplication application, InstanceStore instanceStore, ResumeBookmarkContext`1 resumeContext, IDictionary`2& outArguments) 
   in c:\Projects\TS\trunk\Services\Workflows\Hosting\ActivityInvoker.cs:line 186

更多信息。它的工作方式是操作对象包含工作流版本,名称和实际的Xaml,并将其加载到工作流应用程序中并被调用:

var workflowDefinition = activityResolver.Resolve(new WorkflowIdentity(operation.WorkflowVersion, operation.WorkflowName, operation.WorkflowXaml));

var application = new WorkflowApplication(workflowDefinition.Implementation);

response = activityInvoker.Resume<ResumeOperationResponse>(application, instanceStoreProvider.Create(), resumeContext, out outArguments);

在调用者中,resume方法执行此操作并失败:

    public TResponse Resume<TResponse>(WorkflowApplication application, InstanceStore instanceStore, ResumeBookmarkContext<ResumeOperationRequest> resumeContext,
        out IDictionary<String, object> outArguments)
        where TResponse : ResumeOperationResponse, new()
    {
        var response = new TResponse();
        outArguments = new Dictionary<string, object>();
        IDictionary<string, object> wfOutArguments = new Dictionary<string, object>();

        application.InstanceStore = instanceStore;

        try
        {
            application.Load(resumeContext.WorkflowInstanceId);
        } 
        catch (Exception exp)
        {
             //Exception happens here 
        }
    }

此时我对可能导致此问题的指针感兴趣。

似乎没有办法调试它并找到问题的实际原因。

非常感谢

1 个答案:

答案 0 :(得分:0)

当您将Load方法放在try catch中时,工作流应用程序会抛出此错误。在我的应用程序中,如果我将Load方法调用放在try / catch中,它会在调用方法之前更改guid,从而抛出此异常。 我的修复是从这个方法中取出try catch并将它添加到调用此方法的调用者上。