文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>热门话题:使用WCF实现SOA面向服务编程(五)—— 通过Web服务调用Workflow工作流(开发持久化工作流)

热门话题:使用WCF实现SOA面向服务编程(五)—— 通过Web服务调用Workflow工作流(开发持久化工作流)

时间:2011-01-26  来源:风尘浪子

例子:一个简单的订单录入系统,当第一次加入订单时需要调用Web服务来创建新的Workflow对象实例,创建订单后再多次为订单添加商品,在订单没有提交前,此工作流对象实例会处于一个持久化的状态,等待订单提交后,工作流对象才会结束。

 

我们先开发一个接口:

[Serializable]

public class Order

{...}

 

public class OrderManager

{  

     public int AddOrder(Order order)

     {..........}

}

 

namespace Microsoft.IService
{
    public interface IService_T1
    {
        void Start();
        int AddOrder(Order order);
        void End();
    }
}

 

我们先使用webServiceInputActivity1来启动服务,然后可以利用WhileActivity此活动可实现持久化功能

 

 

在这里将webServiceInputActivity1的IsActivating属性设置为True,这意味着以此活动激活此 Workflow对象实例,然后把InterfaceType设置为Microsoft.IService.IService_T1,并把 MethodName设置为Start,这时候当客户端调用Start方法时,Workflow对象实例就会被激活。

 

然后设置WhileActivity的循环条件,只要IsRepeated的值为True, WhileActivity就可以持续运行,则此Workflow处于持久化状态

 

        public bool IsRepeate=true;

 

        //也可以使用代码条件:

        //private void Replace(object sender, ConditionalEventArgs e)
        //{
        //        e.Result = IsRepeate;
        //}

 

在左边的事件驱动活动中,分别加入webServiceInputActivity2, codeActivity1, webServiceOutputActivity1。将webServiceInputActivity2的InterfaceType设置为 Microsoft.IService.IService_T1,再把MethodName设置为AddOrder,将AddOrder方法中的参数order绑定为Workflow中的参数_order ,这样就可以通过webServiceInputActivity2调动AddOrder方法。然后codeActivity_ExecuteCode方法中加入订单。

 

完整代码:

namespace Microsoft.Workflows

{

 public sealed partial class Workflow: SequentialWorkflowActivity
 {
        public Order _order ;
        public int id ;
        public bool IsRepeate = true ;

        public Workflow2()
        {
            InitializeComponent();
        }

        private void codeActivity1_ExecuteCode(object sender, EventArgs e)
        {
             OrderManager orderManager=new OrderManager();

             int orderID=orderManager.AddOrder(order);

             this.id=orderID;
        }

        private void webServiceInputActivity3_InputReceived(object sender, EventArgs e)
        {
            IsRepeate = false;
        }
  }

}

 

 

最后通过webServiceOutputActivity1结束操作,把InputActivityName设置为webServiceInputActivity2,将ReturnValue绑定变量id 。这样系统在插入Order后就可以获取Order的ID值。

 

现在,可以在右边的事件驱动活动中,插入一个webServiceInputActivity3,把InterfaceType设置为 Microsoft.IService.IService_T1,把MethodName设置为End,然后添加事件InputReceived的处理方 法webServiceInputActivity3_InputReceived,通过此方法把IsRepeate属性设置为false,这样就可以调 动此活动来终于循环,结束此工作流。

 

这时候,我们可以先把此Workflow作为Web发布,得到以下文件

Microsoft.Workflow .Workflow2_WebService.asmx

<%@WebService Class="Microsoft.Workflow.Workflow2_WebService" %>

 

添加配置文件

<?xml version="1.0"?>
<configuration>
    <configSections>
        <section name="WorkflowRuntime" type="System.Workflow.Runtime.Configuration.WorkflowRuntimeSection, System.Workflow.Runtime, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
    </configSections>
    <WorkflowRuntime Name="WorkflowServiceContainer">
        <Services>
            <add type="System.Workflow.Runtime.Hosting.ManualWorkflowSchedulerService, System.Workflow.Runtime, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
            <add type="System.Workflow.Runtime.Hosting.DefaultWorkflowCommitWorkBatchService, System.Workflow.Runtime, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
      <add type="System.Workflow.Runtime.Hosting.SqlWorkflowPersistenceService, System.Workflow.Runtime, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" UnloadOnIdle="true" LoadIntervalSeconds="5" ConnectionString="Data Source=LESLIE-PC;Initial Catalog=WorkflowPersistence;Integrated Security=True"/>

       //这里是为Workflow添加SQL数据库持久化服务,因为这里要是测试持久化的工作流,此配置是必须的。
        </Services>
    </WorkflowRuntime>
    <appSettings/>
    <connectionStrings/>
    <system.web>    
        <compilation debug="true"/> 
        <authentication mode="Windows"/>      
        <httpModules>
            <add type="System.Workflow.Runtime.Hosting.WorkflowWebHostingModule, System.Workflow.Runtime, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="WorkflowHost"/>
        </httpModules>
    </system.web>
</configuration>

 

调用Start方法启动Workflow,然后就可以直接调用AddOrder方法,你会发现与上一个篇的实例不同的是,在上一篇的例子中,每个实 例只允许调用一次,当多次调用时就会出来错误提示。而在这一篇的例子中,AddOrder可以多次调用,并能正常运行,这就证明了你调用的 Workflow的实例对象已经一个持久化工作流,当你未调用End结束服务时,此工作流对象都可以正运行。

 

最后,你可以调用End方法来结束操作,当操作结束后,再调用AddOrder,系统就会出现错误显示:

System.InvalidOperationException: 在状态持久性存储中找不到 ID 为“3a8b9688-fb3f-4a10-bb84-6bf99c30119a”的工作流。

 

总结一下,通过持久化服务流的开发,可以保持工作流实例的活动状态,这样就可以通过多个Web服务进行相互调用。使用这种技术来实现基于工作流的应用程序 ,就可以将它们通过Web服务公开经客户端,并能维持工作状态。

Web服务和WF可以实现相互调用,在这两章里面,为大家介绍如何将工作流发布为Web服务,下一章将为大家介绍通过InvokeWebServiceWorkflow在WF里面调用Web服务。

 

 

热门话题:使用WCF实现SOA面向服务编程(一)——SOA的概念
热门话题:使用WCF实现SOA面向服务编程(二)——实现简单的WCF开发实例
热门话题:使用WCF实现SOA面向服务编程(三)——使用AJAX+WCF服务页面开发
热门话题:使用WCF实现SOA面向服务编程(四)—— 通过Web服务调用Workflow工作流(基础实例) 
热门话题:使用WCF实现SOA面向服务编程(五)—— 通过Web服务调用Workflow工作流(开发持久化工作流)
热门话题:使用WCF实现SOA面向服务编程(六)—— 通过InvokeWebServiceActivity在Workflow工作流中调用Web服务

相关阅读 更多 +
排行榜 更多 +
找茬脑洞的世界安卓版

找茬脑洞的世界安卓版

休闲益智 下载
滑板英雄跑酷2手游

滑板英雄跑酷2手游

休闲益智 下载
披萨对对看下载

披萨对对看下载

休闲益智 下载