【问题标题】:How to host WF4 state machine as a WCF service如何将 WF4 状态机作为 WCF 服务托管
【发布时间】:2012-02-15 12:39:06
【问题描述】:

我是 WF4 的新手。我想要做的是将 WF4 状态机公开为 WCF 服务。我已经创建了状态机。如何使用 WCF 执行转换触发器并更改状态。 http://channel9.msdn.com/Shows/Workflow-TV/endpointtv-WF4-State-Machine-Hands-On-Lab-Exercise-2 。这是我用来创建状态机的教程。

【问题讨论】:

    标签: wcf workflow-foundation workflow-foundation-4 state-machine wcf-4


    【解决方案1】:

    我在State Machine Security Door 写了一个示例来展示如何做到这一点。基本上,您只需在转换中使用 Send/ReceiveReply 对。

    【讨论】:

    • 感谢您的指导。我对你的样品有疑问。是否有理由将服务放入 Web 项目中?我们正在使用 websinc(frozenmountain.com/websync) 服务器从 silverlight 调用服务。
    • XAMLX 文件必须托管在 Web 项目中,或者您可以使用 WorkflowServiceHost 自行托管它们。
    • 所以,您的意思是我们不需要使用像 websync 这样的单独服务器来使用 Silverlight 的 WF 服务。感谢您的帮助。
    • 工作流不能由 Silverlight 托管。它们需要 .NET 运行时,因此在这种情况下它们必须托管在另一个服务器进程中。
    【解决方案2】:

    如果您不想发送和接收活动,则可以进行一些工作。对于进行相关工作的最终客户来说,发送和接收活动可能很难编写。 另一方面,如果有一个通用的客户端入口会更好,这样客户端就不需要更新服务引用,而只需要一个合同定义。

    我们删除了所有相关性并创建了一个通用 Web 服务,它重新路由到特定的 xamlx 工作流,但不使用发送/接收活动。相反,我们在 xamlx 工作流程中使用书签。 所以我们创建了一个自己的活动来接收自定义页面流数据和另一个活动来将数据发送回实例。我们遇到的唯一问题。

    public interface IWorkflowService
    {
        #region State Machine / Pageflow Operations
    
        [OperationContract]
        IPageflowData Start(IPageflowData pageflowData);
    
        [OperationContract(Name = "StartWithInputs")]
        IPageflowData Start(IPageflowData pageflowData, IDictionary<string, object> inputs);
    
        [OperationContract]
        IPageflowData Resume(PageflowCommand command, IPageflowData pageflowData);
    
        [OperationContract(Name = "ResumeWithExecuteCommand")]
        IPageflowData Resume(string commandName, IPageflowData pageflowData);
    
        [OperationContract]
        IPageflowData ResumeTo(string stepName, IPageflowData pageflowData);
    
        #endregion
    

    这与实现 IworkflowCreation 合同的名为 WorkflowCreationEndpoint 的 WF 示例中可用的动态端点相结合。

    [ServiceContract(Name = "IWorkflowCreation")]
    public interface IWorkflowCreation
    {
        [OperationContract(Name = "Create")]
        Guid Create(IDictionary<string, object> inputs);
    
        [OperationContract(Name = "CreateWithInstanceId", IsOneWay = true)]
        void CreateWithInstanceId(Guid instanceId, IDictionary<string, object> inputs);
    
        [OperationContract(Name = "ResumeBookmark")]
        void ResumeBookmark(Guid instanceId, string bookmarkName, object bookmarkValue);
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-11
      • 1970-01-01
      相关资源
      最近更新 更多