热门话题:使用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服务