0

カスタム インスタンス ストアを使用して単純なワークフロー サービスを作成しました (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);
            }

    ......
    }
4

2 に答える 2

0

MSDN の記事には、実装する必要がある最小限のコマンドのみが示されています。より多くのコマンドをサポートする必要があるようですので、まだサポートしていないコマンドがディスパッチされているかどうかを確認します。コマンド一覧はこちらをご覧ください。

于 2013-02-05T13:15:08.357 に答える
0

BeginTryCommand は、次のコマンドをこの順序で実行して呼び出されます。 1. CreateWorkflowOwnerCommand 2. LoadWorkflowCommand 3. SaveWorkflowCommand 4. SaveWorkflowCommand

したがって、LoadWorkflowCommand の場合: Load の前に Create Instance が必要です

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

于 2013-02-18T09:08:23.693 に答える