在一个相当复杂的系统中恢复工作流时,我一直被一个错误所困扰,到目前为止,我几乎没有找到解决方案的运气。
当我恢复工作流程时会发生错误。工作流程和活动发生了变化,但存在不应该影响的版本控制。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
}
}
在这一点上,我对可能导致这种情况的指针感兴趣。
似乎没有办法调试它并找到问题的实际原因。
非常感谢