zoukankan      html  css  js  c++  java
  • 风尘浪子 只要肯努力,梦想总有一天会实现 WF工作流与Web服务的相互调用 —— 通过Web服务调用Workflow工作流(开发持久化工作流) _转

    如果你曾经负责开发企业ERP系统或者OA系统,工作流对你来说一定并不陌生。工作流(Workflow)是对工作流程及其各操作步骤之间业务规则 的抽象、概括、描述。工作流要解决的主要问题是:为实现某个业务目标,在多个参与者之间,利用计算机,按某种预定规则自动传递文档、信息或者任务。WF正 是解决企业核心问题的关键,通过WF可以轻松地轻 松地按照业务逻辑去实现开发,然后把WF发布为Web服务,这样客户端与服务与服务器端通讯就不会再受开发语言的影响,通过Web服务就可以轻松调用WF 去实现业务操作。

    下面以一个简单的订单录入系统为例子,为你介绍一下如何将Workflow工作流发布为Web服务。

    为了实现一个持久化工作流,首先以实用工具sqlcmd来建立一个本地数据库,打开命令提示符窗口,输入

    sqlcom -S localhostSQLEXPRRESS -E -Q "create database WorkflowPersistence"

    然后打开文件夹

    Microsoft.NetFrameworkv3.0Windows Workflow FoundationSQL[Lauguage]

    里面有2个脚本文件

    SqlPersistenceService_Schema.sql , SqlPersistenceService_Logic.sql

    在数据库WorkflowPersistence上运行此脚本文件,数据库就可以成功创建。

    实例描述:当客户第一次加入订单时通过Web服务调用Start方法来创建新的Workflow对象实例,之后可以多次调用AddOrder方法添 加订 单,在订单没有提交前,此工作流对象实例会处于一个持久化的状态。当服务器处于空闲状态下Workflow对象的有关数据会存储于 WorkflowPersitence数据库里面,这样做可以有效减少服务器缓存的压力。最后调用End方法提交订单后,Workflow工作流对象才会 结束,Workflow对象的数据就会在数据库中被删除。

    这里先定义一个Order类,别忘记给对象加上Serializable串行化属性,为Order开发一个操作类OrderManager,里面包括一个方法AddOrder,当每加入一个Order,方法就会返回新加入Order的ID。

    ===================================

    创建数据库 -----》C:WindowsMicrosoft.NETFrameworkv4.XXXXSQLen-----》SqlPersistenceService_Schema.sql , SqlPersistenceService_Logic.sql    执行数据 两个文件一样。

    ===================================

    [Serializable] 
    
    publicclass Order
    
    {...}
    
    publicclass OrderManager        
    
    {  
    
         publicint AddOrder(Order order)
    
         {..........}
    
    }
    View Code

    现在对应此实例我们先开发一个接口IService_T1,Start方法表示启动此Workflow工作流,而End表示此工作流完结

    namespace Microsoft.IService
    {
        publicinterface IService_T1
        {
            void Start();
            int AddOrder(Order order);
            void End();
        }
    }
    View Code

    下图是这个Workflow的完整视图,我们先使用webServiceInputActivity1来启动服务

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

    然后设置WhileActivity的循环条件(this.IsRepeated==true),这说明只要IsRepeated的值为True, WhileActivity就可以持续运行,则此Workflow处于持久化状态

     

    现在为listenActivity1设置2个事件驱动活动,在左边的事件驱动活动中,分别加入 webServiceInputActivity2, codeActivity1, webServiceOutputActivity1。将webServiceInputActivity2的InterfaceType设置为 Microsoft.IService.IService_T1,再把MethodName设置为AddOrder,将AddOrder方法中的参数order绑定为此Workflow对象中的参数_order (参考完整代码),这样就可以通过webServiceInputActivity2调动AddOrder方法。然后在codeActivity的codeActivity_ExecuteCode方法中加入操作代码。

    最后通过webServiceOutputActivity1结束操作,把InputActivityName属性设置为webServiceInputActivity2,将ReturnValue绑定变量id 。这样系统在插入Order后就可以获取AddOrder方法的返回值(int) id。

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

    此为该Workflow的完整代码:

    namespace Microsoft.Workflows
    {
     publicsealedpartialclass Workflow: SequentialWorkflowActivity
     {
            public Order _order ;
            publicint id ;
            publicbool IsRepeate =true ;
    
            public Workflow2()
            {
                InitializeComponent();
            }
            //当调用AddOrder方法时执行此操作,通过orderManager对象插入order,最后返回值orderID赋值给此Workflow参数id
    privatevoid codeActivity1_ExecuteCode(object sender, EventArgs e)
            {
                 OrderManager orderManager=new OrderManager();
    
                 int orderID=orderManager.AddOrder(order);
    
                 this.id=orderID;
            }
            //当调用webServiceInputActivity3活动时,把IsRepeate的值设置为false,这样可以终止循环给束此工作流对象。
    privatevoid webServiceInputActivity3_InputReceived(object sender, EventArgs e)
            {
                IsRepeate =false;
            }
      }
    }
    View Code

    这时候右键点击此“项目”,选择 “把此Workflow作为Web发布”,得到以下ASMX文件

    Microsoft.Workflows.Workflow2_WebService.asmx

    <%@WebService class="Microsoft.Workflows.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>
    View Code

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

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

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

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

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

    WF工作流与Web服务的相互调用 —— 通过Web服务调用Workflow工作流(基础实例)
    WF工作流与Web服务的相互调用 —— 通过Web服务调用Workflow工作流(开发持久化工作流)
    WF工作流与Web服务的相互调用 —— 以InvokeWebServiceActivity在Workflow工作流调用Web服务
    WF工作流与Web服务的相互调用 —— WF与WCF互相调用(利用ReceiveActivity把WF发布为WCF)

  • 相关阅读:
    js全局变量和局部变量
    mysql分组后保留n条数据
    记一次微信公众号的开发与后台搭建
    Excel 导入 Sql Server出错——“文本被截断,或者一个或多个字符在目标代码页中没有匹配项”错误的解决
    一言之思-3
    时间获取
    sql基础的基础
    一言之思-2
    一言之思
    node.js日期
  • 原文地址:https://www.cnblogs.com/weixing/p/5148299.html
Copyright © 2011-2022 走看看