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