WF in Asp.Net

这几天在研究Windows Workflow Foundation,天天上 www.windowsworkflow.net 的论坛上查看和询问,全都是英文,头都看大了,对这金山词霸一个一个的啃。闲话少说,步入正题吧!

本篇主要讲WF在asp.net运用。如下:
我的流程设置如下:


设置了一个CodeActive和一个HandleExternalEventActive
CodeActive是执行一段代码的Active
HandleExternalEventActive是外联一个Event的Active

首先,配置web.config

ContractedBlock.gif ExpandedBlockStart.gif
<!--<br><br>Code highlighting produced by Actipro CodeHighlighter (freeware)<br>http://www.CodeHighlighter.com/<br><br>-->None.gif<?xml version="1.0"?>
None.gif
<configuration xmlns="http://schemas.microsoft.com/.NetConfiguration/v2.0">
None.gif    
<configSections>
None.gif        
<section name="WorkflowRuntime" type="System.Workflow.Runtime.Configuration.WorkflowRuntimeSection, System.Workflow.Runtime, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
None.gif    
</configSections>
None.gif    
<appSettings/>
None.gif    
<connectionStrings/>
None.gif    
<system.web>
None.gif        
<authentication mode="Windows"/>
None.gif        
<compilation debug="true">
None.gif            
<assemblies>
None.gif                
<add assembly="System.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
None.gif                
<add assembly="System.Drawing.Design, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
None.gif                
<add assembly="System.Transactions, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
None.gif                
<add assembly="System.Workflow.Activities, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
None.gif                
<add assembly="System.Workflow.ComponentModel, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
None.gif                
<add assembly="System.Workflow.Runtime, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31BF3856AD364E35"/>
None.gif                
<add assembly="Microsoft.Build.Tasks, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
None.gif                
<add assembly="System.Messaging, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
None.gif                
<add assembly="System.Runtime.Remoting, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
None.gif                
<add assembly="System.DirectoryServices, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
None.gif                
<add assembly="System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"/>
None.gif                
<add assembly="Microsoft.Build.Utilities, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
None.gif                
<add assembly="Microsoft.Build.Framework, Version=2.0.0.0, Culture=neutral, PublicKeyToken=B03F5F7F11D50A3A"/>
None.gif            
</assemblies>
None.gif        
</compilation>
None.gif    
</system.web>
None.gif  
None.gif  
<!--注册服务-->
None.gif    
<WorkflowRuntime Name="WorkflowServiceContainer">
None.gif        
<Services>
None.gif      
<add type="System.Workflow.Runtime.Hosting.ManualWorkflowSchedulerService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
None.gif      
<add type="System.Workflow.Activities.ExternalDataExchangeService, System.Workflow.Activities, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
None.gif      
<add type="System.Workflow.Runtime.Hosting.SqlWorkflowPersistenceService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" UnloadOnIdle="true" ConnectionString="Initial Catalog=PersistenceStore;Data Source=localhost;Integrated Security=SSPI;"/>
None.gif      
<add type="System.Workflow.Runtime.Tracking.SqlTrackingService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" ConnectionString="Initial Catalog=TrackingStore;Data Source=localhost;Integrated Security=SSPI;"/>
None.gif    
</Services>
None.gif    
</WorkflowRuntime>
None.gif
None.gif  
<!--设置追踪,会在网站根目录下出现WFTrace.log文件-->
None.gif  
<system.diagnostics>
None.gif    
<switches>
None.gif      
<add name="WorkflowTraceToDefault" value="1" />
None.gif      
<add name="Host" value="All" />
None.gif      
<add name="Runtime" value="All" />
None.gif      
<add name="Tracking" value="All" />
None.gif      
<add name="Activity" value="All" />
None.gif      
<add name="Rules" value="All" />
None.gif    
</switches>
None.gif    
<trace autoflush="true" indentsize="4">
None.gif      
<listeners>
None.gif        
<add name="myListener" type="System.Diagnostics.TextWriterTraceListener" initializeData="WFTrace.log" />
None.gif      
</listeners>
None.gif    
</trace>
None.gif  
</system.diagnostics>
None.gif
</configuration>
None.gif

简单介绍上面的配置文件
a.注册服务
这里是将一些服务注册到 Workruntime中,你也可以在代码中使用AddServcie中注册服务。
注册好服务后,就可以在代码中
ExternalDataExchangeService dataService = workflowRuntime.GetService<ExternalDataExchangeService>();
以上方式得到服务。
b.跟踪
配置跟踪信息,非常有用,我有一次调试的时候,MSDTC 服务没有启动的错误,就是查看WFTrace.log文件而获得的。

然后,在Global中启动一个WorkRunTime
None.gif void Application_Start(object sender, EventArgs e)
None.gif    {
None.gif        System.Workflow.Runtime.WorkflowRuntime workflowRuntime = new System.Workflow.Runtime.WorkflowRuntime("WorkflowRuntime");
None.gif        Application["WorkflowRuntime"] = workflowRuntime;
None.gif
None.gif        System.Workflow.ComponentModel.Compiler.TypeProvider typeProvider = new System.Workflow.ComponentModel.Compiler.TypeProvider(workflowRuntime);
None.gif        typeProvider.AddAssembly(typeof(WorkflowLibrary1.Workflow1).Assembly);
None.gif        workflowRuntime.AddService(typeProvider);
None.gif
None.gif        workflowRuntime.StartRuntime();
None.gif    }
None.gif
None.gif    void Application_End(object sender, EventArgs e)
None.gif    {
None.gif        System.Workflow.Runtime.WorkflowRuntime workflowRuntime = Application["WorkflowRuntime"] as System.Workflow.Runtime.WorkflowRuntime;
None.gif        workflowRuntime.StopRuntime();
None.gif    }

接着,就可以在程序中运行workflow了
None.gif private void StartWorkflow()
None.gif    {
None.gif        WorkflowRuntime workflowRuntime = StartRuntime();
None.gif
None.gif        // Now get a refernece to the ManualWorkflowSchedulerService
None.gif        ManualWorkflowSchedulerService scheduler =
None.gif            workflowRuntime.GetService
< ManualWorkflowSchedulerService > ();
None.gif
None.gif        // Attach to the WorkflowCompleted event
None.gif        workflowRuntime.WorkflowCompleted += new EventHandler
< WorkflowCompletedEventArgs > (WorkflowRuntime_WorkflowCompleted);
None.gif
None.gif        WorkflowInstance workflowInstance = workflowRuntime.CreateWorkflow(typeof(WorkflowLibrary1.Workflow1));
None.gif
None.gif        workflowInstance.Start();
None.gif
None.gif        // Now run the workflow.  This is necessary when 
None.gif        // dot.gifusing the ManualWorkflowSchedulerService
None.gif        scheduler.RunWorkflow(workflowInstance.InstanceId);
None.gif    }
None.gif
None.gif
None.gif
None.gif
None.gif    private WorkflowRuntime StartRuntime()
None.gif    {
None.gif        WorkflowRuntime workflowRuntime = Application["WorkflowRuntime"] as WorkflowRuntime;
None.gif
None.gif        ExternalDataExchangeService dataService = workflowRuntime.GetService
< ExternalDataExchangeService > ();
None.gif        OrderLocalServices.OrderService orderService = workflowRuntime.GetService
< OrderLocalServices .OrderService > ();
None.gif
None.gif        if (orderService == null)
None.gif        {
None.gif            orderService = new OrderLocalServices.OrderService();
None.gif            dataService.AddService(orderService);
None.gif        }
None.gif
None.gif        // Attach to the WorkflowCompleted event
None.gif        workflowRuntime.WorkflowCompleted += new EventHandler
< WorkflowCompletedEventArgs > (WorkflowRuntime_WorkflowCompleted);
None.gif        return workflowRuntime;
None.gif    }

最后,运行代码后,当运行完上图中的CodeActive后,该workflowinstance将进入等待状态(会触发workflowRuntinme的WorkflowIdled事件)。
这个时候你如果注册了SqlWorkflowPersistenceService服务,和创建了PersistenceStore数据库,则会将此
工作流保存到数据库中,已备下次使用,关于这块下次我再整理。
为什么工作流会等待了,
因为接下来的环节HandleExternalEventActive的Active必须需要触发了和他相关联的事件后,他才会继续的。
所以,我可以针对workflowRuntinme增加WorkflowIdled事件,实现事件的代码如下:
None.gif     void  workflowRuntime_WorkflowIdled( object  sender, WorkflowEventArgs e)
ExpandedBlockStart.gifContractedBlock.gif    
dot.gif {
InBlock.gif        
InBlock.gif        WorkflowRuntime workflowRuntime 
= Application["WorkflowRuntime"]  
InBlock.gif        OrderService orderService 
= workflowRuntime.GetService<OrderService>();
InBlock.gif
InBlock.gif        WorkflowInstance instance 
= workflowRuntime.GetLoadedWorkflows()[0];
InBlock.gif
InBlock.gif        instance.Load();
InBlock.gif
InBlock.gif        
//触发相关联的事件
InBlock.gif
        orderService.RaiseOrderUpdatedEvent(instance.InstanceId);
InBlock.gif
InBlock.gif
ExpandedBlockEnd.gif    }

这样这个工作流就整个的执行完成了。






  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值