MSDN でこの質問と同じ問題がありますが、単一のワークフロー インスタンスが同時に実行されているときに、Roman Kiss のソリューションがエンドポイント アドレスを正しく置き換えるかどうかがまだはっきりしないため、解決策がわかりません。
内部Send
アクティビティが特定のエンドポイント アドレスを持つ 1 つのスレッドによって実行されるようにスケジュールされている場合、このアドレスは、別のエンドポイント アドレスで同じアクティビティをスケジュールする別のスレッドによってオーバーライドされませんか? 間違っている場合は訂正してください。ただし、現在のワークフロー実行コンテキストが何であれ、バインドされSend.Endpoint
ているのとは対照的に、通常のプロパティであるため、そうなると思います。InArgument<Endpoint>
誰かがこれにもっと光を当てることができますか?
アップデート
Roman Kiss が提供するソリューションをテストしたところ、私のシナリオでは期待どおりに機能しないことがわかりました。Execute
メソッドを次のように変更しました。
protected override void Execute(NativeActivityContext context)
{
Thread.Sleep(Address.Get(context).EndsWith("1") ? 1000 : 0);
Body.Endpoint.Binding = GetBinding(Binding.Get(context));
Body.Endpoint.AddressUri = new Uri(Address.Get(context));
Thread.Sleep(Address.Get(context).EndsWith("1") ? 0 : 3000);
var address = Address.Get(context) + " => " + Body.Endpoint.AddressUri;
Console.WriteLine(address);
Thread.Sleep(10000);
context.ScheduleActivity(Body);
}
このテストを実行しました:
static void Main(string[] args)
{
// Workflow1 is just a SendScope wrapped around by a Sequence with single Address input argument exposed
var workflow = new Workflow1();
Task.WaitAll(
Task.Run(() => WorkflowInvoker.Invoke(workflow, new Dictionary<string, object> { { "Address", @"http://localhost/1" } })),
Task.Run(() => WorkflowInvoker.Invoke(workflow, new Dictionary<string, object> { { "Address", @"http://localhost/2" } })));
Console.ReadLine();
}
私が得ている結果は次のとおりです。
http://localhost/1 => http://localhost/1
http://localhost/2 => http://localhost/1
質問は未解決のままです: 実行時にSend
アクティビティのエンドポイント アドレスを動的に割り当てるにはどうすればよいですか?