1

在一个相当复杂的系统中恢复工作流时,我一直被一个错误所困扰,到目前为止,我几乎没有找到解决方案的运气。

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

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

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

application.Load(resumeContext.WorkflowInstanceId);

在数据库中,我可以找到具有该 Guid 的实例,它看起来还不错,所以我不明白为什么它不会加载。

我在整个谷歌中发现只有一个页面出现了这个错误并且没有答案,所以它是那里的沙漠。

堆栈跟踪是无用的:

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 
        }
    }

在这一点上,我对可能导致这种情况的指针感兴趣。

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

非常感谢

4

1 回答 1

0

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

于 2013-10-23T06:05:13.433 回答