1


0

WCFを介してワークフローに開始パラメーターを渡す方法

次のように、 `WorkflowInstance.CreateWorkflow`を使用していくつかの開始値をワークフローに定義できます。

using(WorkflowRuntime runtime = new WorkflowRuntime())
{
    Dictionary parameters = new Dictionary();
    parameters.Add("First", "something");
    parameters.Add("Second", 42);

    WorkflowInstance instance =
        runtime.CreateWorkflow(typeof(MyStateMachineWorkflow), parameters);
    instance.Start();
    waitHandle.WaitOne();
}

このようにして、「MyStateMachineWorkflow」インスタンスが作成され、「First」および「Second」パブリックプロパティがその辞書値を取得します。

しかし、私はWCFを使用しています。これまで、2つの引数を受け入れる Start`メソッドを作成し、 ReceiveActivity`でbindを使用してその必須フィールドを設定しました。

using (WorkflowServiceHost host =
    new WorkflowServiceHost(typeof(MyStateMachineWorkflow)))
{
    host.Open();

    ChannelFactory factory =
        new ChannelFactory("MyStateMachineWorkflow");
    IMyStateMachineWorkflow proxy = factory.CreateChannel();

    // set this values through binding on my ReceiveActivity
    proxy.Start("something", 42);
}

これは機能しますが、異常が発生します。そのメソッドは、_should_が1回だけ呼び出されます。

これらの引数を渡すWCFを介してワークフローインスタンスを開始するにはどうすればよいですか? テストでは、そのプロキシメソッドを呼び出した後、実際にワイヤーを介してワークフローと対話します。 他の方法はありますか?

1 Answer


1


ワークフローを開始するためにパラメーターを渡す方法についてのあなた自身の質問に答えているようです。 ここに残っていると思われる唯一の質問は、「人々が最初に一度だけ呼び出すようにするにはどうすればよいですか?」 正しい?

最初に呼び出されるようにするには、 `Start`のOperationContractAttributeでhttp://msdn.microsoft.com/en-us/library/system.servicemodel.operationcontractattribute.isinitiating.aspx[IsInitiatingプロパティ]をtrueに設定し、他のすべてのメソッドをfalseにします。 これで、メソッドが再度呼び出されるのを止めることはできませんが、WCF / WFを適切に設計してステートマシンを設計した場合、ワークフローでその状態に移行できないという事実によって処理する必要があると思います統合によって何らかの例外がスローされるはずです。

ワークフローでWCFを使用する方法についての良い記事があります。http://msdn.microsoft.com/en-us/library/cc179586.aspx [MSDNのこちら]をチェックしてください。