【问题标题】:How to pass start parameters to workflow through WCF如何通过 WCF 将启动参数传递给工作流
【发布时间】:2010-03-26 03:36:54
【问题描述】:

可以使用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 实例被创建,First 和 Second 公共属性获取该字典值。

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

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 传递这些参数来启动工作流实例?在我的测试中,我只是在调用该代理方法后通过线路与我的工作流程进行交互。还有其他方法吗?

【问题讨论】:

    标签: wcf .net-3.5 workflow-foundation


    【解决方案1】:

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

    可以通过将 Start 的 OperationContractAttribute 上的 the IsInitiating property 设置为 true 并将所有其他方法设置为 false 来确保首先调用它。现在,这不会阻止该方法再次被调用,但我认为这应该通过这样一个事实来处理,即如果您正确设计了状态机,那么 WCF/WF 将无法进入工作流中的该状态集成应该为您抛出某种异常。

    有一篇关于如何在工作流中使用 WCF 的好文章here on MSDN,您应该看看。

    【讨论】:

    • 嗯,有趣的想法;我会尝试并返回结果; TIA
    猜你喜欢
    • 2021-06-13
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-30
    • 1970-01-01
    • 2021-11-18
    相关资源
    最近更新 更多