如何通过WCF将启动参数传递给工作流

时间:2010-03-26 03:36:54

标签: wcf .net-3.5 workflow-foundation

可以使用WorkflowInstance.CreateWorkflow为工作流定义一些起始值,如下所示:

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

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

这样,就会创建一个MyStateMachineWorkflow实例,FirstSecond个公共属性会获取该字典值。

但我正在使用WCF;到目前为止,我设法创建了一个Start方法,接受了这两个参数,并通过在ReceiveActivity上使用bind来设置所需的字段:

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

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

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

虽然这有效,但会产生异常:只能被调用一次。

如何通过WCF传递这些参数来启动工作流实例?在我的测试中,我实际上在调用代理方法之后通过电线与我的工作流进行交互。还有其他方法吗?

1 个答案:

答案 0 :(得分:1)

您似乎已回答了有关如何传递参数以启动工作流程的问题。似乎仍然留在这里的唯一问题是“我如何确保人们首先调用”开始“并且只调用一次?正确的吗?

确保首先调用它可以通过将Start的OperationContractAttribute上的the IsInitiating property设置为true并将所有其他方法设置为false来完成。现在,这不会停止再次调用该方法,但我认为应该通过以下事实处理:如果您已正确设计状态机,则无法在工作流中进入该状态,因此WCF / WF整合应该为你提出某种例外。

有一篇很好的文章介绍了如何将WCF与工作流程here on MSDN一起使用,你应该查看它。