Windows Workflow 4,自定义实例存储无法正常工作

时间:2013-02-05 07:35:31

标签: workflow-foundation-4

我使用自定义实例存储创建了一个简单的工作流服务(以支持oracle)。 自定义实例存储,我按照MSDN的演示:[http://msdn.microsoft.com/en-us/library/ee829481.aspx] [1] 但是当我调用服务api时,引发异常:

  

从实例存储中检索了错误类型的值。一个   类型值{/ Default Web Site /} OrderService.svc是预期的,但是   而是遇到了null。

我尝试使用SqlWorkflowInstanceStore,没关系。服务没问题。 我再次使用自定义实例存储并进行调试,我发现在 SaveWorkflowCommand 之前执行 LoadWorkflowCommand 。我认为这是一个问题。需要你的帮助!

以下是我的代码段:

1. Web Config:
<extensions>
      <behaviorExtensions>
        <add name="databaseWorkflowInstanceStore" type="Practices.Framework.Workflow.Configuration.DatabaseInstanceStoreElement, Practices.Framework" />
      </behaviorExtensions>
    </extensions>

    <behaviors>
      <serviceBehaviors>
        <behavior>
          <!--<sqlWorkflowInstanceStore connectionStringName="practicesDatabase" instanceCompletionAction="DeleteAll" instanceEncodingOption="GZip" />-->
          <databaseWorkflowInstanceStore database="practicesDatabase" />
          <serviceDebug includeExceptionDetailInFaults="true" />
        </behavior>
      </serviceBehaviors>
    </behaviors>

2. DatabaseInstanceStore 
    public class DatabaseInstanceStore : InstanceStore
    {
    protected override IAsyncResult BeginTryCommand(InstancePersistenceContext context, InstancePersistenceCommand command, TimeSpan timeout, AsyncCallback callback, object state)
            {
                if (command is CreateWorkflowOwnerCommand)
                {
                    var instanceOwnerId = Guid.NewGuid();
                    context.BindInstanceOwner(instanceOwnerId, instanceOwnerId);
                }
                else if (command is LoadWorkflowCommand)
                {
                    var instanceData = this.LoadInstanceData();
                    context.LoadedInstance(InstanceState.Initialized, instanceData, null, null, null);
                }
                else if (command is SaveWorkflowCommand)
                {
                    var saveCommand = (SaveWorkflowCommand)command;
                    var instanceData = saveCommand.InstanceData;

                    this.SaveInstanceData(instanceData);
                }

                return new CompletedAsyncResult<bool>(true, callback, state);
            }

    ......
    }

2 个答案:

答案 0 :(得分:0)

MSDN文章仅显示您需要实现的最少命令。听起来你需要支持更多的命令,所以我会检查你不支持的调度命令。有关命令列表,请参阅here

答案 1 :(得分:0)

使用以下顺序执行以下命令调用BeginTryCommand: 1. CreateWorkflowOwnerCommand 2. LoadWorkflowCommand 3. SaveWorkflowCommand 4. SaveWorkflowCommand

所以对于LoadWorkflowCommand: 我需要在加载

之前创建实例

http://social.msdn.microsoft.com/Forums/en/dublin/thread/e51d7b18-1e27-4335-8ad0-4ce76b9f8b91