WF(Workflow foundation)与Asp.net结合

本文通过两个案例详细介绍如何在ASP.NET应用中集成Windows Workflow Foundation (WF),包括状态机工作流与顺序工作流的应用实践。

案例1

本文参考WF (Windows Workflow Foundation) 工作流学习(一)一个Asp.Net状态机验证程序 通过本文本文的介绍,我们主要了解wf中的状态机statemachine在asp.net下的运行机制。

开发环境:win7+vs2008 sp1

步骤1

打开VS2008,创建一个解决方案WfAndAspNet,然后在该解决方案中添加一个Asp.net web应用程序WebApplication和状态机工作流库WorkflowLibrary。如下图所示。

clip_image002clip_image004

完整的解决方案如图所示。

clip_image005

其中AspNet和SequenceWorkflowLibrary是第二个项目用到的,这个稍后再提。

步骤2

为WorkflowLibray添加一个接口Interface1接口中只有一个方法:

string Validate(string Name);

步骤3

打开WorkflowLibrary中的Workflow1.cs的设计视图,在其中添加两个状态stateActivity1和stateActivity2,然后在Workflow1InitialState中添加EventDriven活动eventDrivenActivity1,在stateAcitvity1状态中添加StateInitialzation活动stateInitialzationActivity1,如下图所示。

clip_image007

接着选中stateActivity2,右键以后会发现有“设置为初始状态”和“设置为已完成状态”,在这里我们选择“设置为已完成状态”,这时候stateActivity2右上角的图标会发生变化。

步骤4

双击eventDrivenActivity1活动,进入如下编辑视图

clip_image008

在eventDrivenActivity1中添加WebServiceInput事件,将参数配置到活动中去,属性如下图所示。

clip_image009

其中属性中的参数,我是通过对话框创建的,点击参数后面的小按钮,会弹出下面的对话框,选择“绑定到新成员”选项卡,创建属性。配置方法如下图所示:

clip_image011

在stateInitialzationActivity1活动中添加WebServiceOutput活动,并配置属性。如下图所示

clip_image012clip_image013clip_image015

双击webServiceOutputActivity1为这个活动添加代码:

private void webServiceOutputActivity1_SendingOutput(object sender, EventArgs e) { string name = this.webServiceInputActivity1__Parameter_Name1; if (name == "xuwei") { this.webServiceOutputActivity1__ReturnValue_1 = "成功"; } else { this.webServiceOutputActivity1__ReturnValue_1 = "失败"; } }

步骤5

右键工作流项目WorkflowLibrary-->选择“作为Web 服务发布”,系统会自动生成一个Web Service。然后我们在asp.Net 程序中引用这个Web Service ,在Asp.Net 页面添加几个控件,再编写后台C#代码,就可以调用这个状态机中的方法。

Default.aspx.cs代码

namespace WebApplication { public partial class _Default : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } protected void Button1_Click(object sender, EventArgs e) { localhost.Workflow1_WebService ws = new WebApplication.localhost.Workflow1_WebService(); this.Label1.Text = ws.Validate(TextBox1.Text); } } }

前台代码:

<body> <form id="form1" runat="server"> <p>输入“xuwei”点击确定则显示成功,输入其他点击确定按钮则显示失败</p> <div> <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> </div> <div> <asp:Button ID="Button1" runat="server" Text="确定" onclick="Button1_Click" /> </div> <div> <asp:Label ID="Label1" runat="server"></asp:Label> </div> </form> </body>

运行结果如下图所示

3

4

案例2

参考WF (Windows Workflow Foundation) 工作流学习(二)一个Asp.Net与顺序工作流结合的例子

步骤1

在WfAndAspNet解决方案中添加asp.net web应用程序AspNet以及一个顺序工作流库SequenceWorkflowLibrary

步骤2

为AspNet应用程序添加顺序工作流库SequenceWorkflowLibrary的引用以及对workflow程序集的引用,如下图所示

1

步骤3

向Web.Config 中加入WF的注册。

<?xml version="1.0"?> <configuration> <configSections> <!--WF注册服务--> <section name="WorkflowRuntime" type="System.Workflow.Runtime.Configuration.WorkflowRuntimeSection, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/> <!--结束WF注册服务--> </configSections> <!--WF注册服务--> <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"/> </Services> </WorkflowRuntime> <!--结束WF注册服务--> <appSettings/> <connectionStrings/> </configuration>  

步骤4

添加一个全局Global.asax 文件,添加如下代码

namespace AspNet { public class Global : System.Web.HttpApplication { //负责wf在asp.net下的寄宿工作。 protected void Application_Start(object sender, EventArgs e) { //读取web.config中的配置信息来创建实例 //<section name="WorkflowRuntime" type="System.Workflow.Runtime.Configuration.WorkflowRuntimeSection, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /> WorkflowRuntime workflowRuntime = new WorkflowRuntime("WorkflowRuntime"); workflowRuntime.StartRuntime();//启动工作流运行时 //指定当前工作流运行时 Application["WorkflowRuntime"] = workflowRuntime; } protected void Session_Start(object sender, EventArgs e) { //获取应用程序的当前状态。 WorkflowRuntime workflowRuntime = Application["WorkflowRuntime"] as WorkflowRuntime; //关闭工作流运行时 workflowRuntime.StopRuntime(); } } } 

步骤5

向SequenceWorkflowLibrary中的workflow1.cs中添加一个代码活动,如下图所示

2

双击代码活动,添加该活动所对应的代码

namespace SequenceWorkflowLibrary { public sealed partial class Workflow1 : SequentialWorkflowActivity { public string Name { get; set; } public string Result { get; set; } public Workflow1() { InitializeComponent(); } private void codeActivity1_ExecuteCode(object sender, EventArgs e) { Result = "hello " + Name; } } }  

 

步骤6

前台代码Default.aspx

<body> <form id="form1" runat="server"> <div> <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox> <asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" /> <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label> </div> </form> </body> 

后台代码Default.aspx.cs

namespace AspNet { public partial class _Default : System.Web.UI.Page { string Result = string.Empty;//全局变量 protected void Page_Load(object sender, EventArgs e) { } //按钮触发工作流事件。点击按钮以后的工作全部交给工作流完成。 protected void Button1_Click(object sender, EventArgs e) { StartWorkflow(); Label1.Text = Result; } private void StartWorkflow() { //获取当前工作流运行时 WorkflowRuntime workflowRuntime = Application["WorkflowRuntime"] as WorkflowRuntime; //动态运用ManualWorkflowSchedulerService,以取得不同的Thread作服务 ManualWorkflowSchedulerService scheduler = workflowRuntime.GetService(typeof(ManualWorkflowSchedulerService)) as ManualWorkflowSchedulerService; //载入WorkflowCompleted的事件驱动,这是指工作流完成以后才会去执行的动作。现在工作流正在运行,所以还没有执行。 workflowRuntime.WorkflowCompleted+=new EventHandler<WorkflowCompletedEventArgs>(workflowRuntime_WorkflowCompleted); //创建Dictionary工作流参数 Dictionary<String, Object> wfPara = new Dictionary<string, object>(); //添加属性值 wfPara.Add("Name", TextBox1.Text); //创建工作流实例,并传递参数给工作流实例。 WorkflowInstance workflowInstance = workflowRuntime.CreateWorkflow(typeof(SequenceWorkflowLibrary.Workflow1),wfPara); //启动工作流实例 workflowInstance.Start(); //调度工作流实例,并发布该工作流 scheduler.RunWorkflow(workflowInstance.InstanceId); } //WorkflowCompleted的事件驱动 void workflowRuntime_WorkflowCompleted(object sender,WorkflowCompletedEventArgs e) { if(e.OutputParameters.ContainsKey("Result"))//如果输出参数中还有键为Result的参数 { Result=(string)e.OutputParameters["Result"];//则将该键所对应的值赋予变量Result } } } }  

最后程序界面如下图所示: 

 

转载于:https://www.cnblogs.com/xwdreamer/archive/2011/05/09/2297018.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值