玄铁剑

成功的途径:抄,创造,研究,发明...
posts - 128, comments - 42, trackbacks - 0, articles - 174

将工作流(WF)用于ASP.NET

Posted on 2008-06-29 10:24 玄铁剑 阅读(3369) 评论(0)  编辑 收藏 引用 所属分类: asp.netWF

创建 Windows Workflow Foundation 是为了在不同的宿主应用程序环境中运行。 ASP.NET Web 窗体就是一种这样的支持环境。 但是,当为 Windows Workflow Foundation 创建基于 Web 的宿主应用程序时,必须设计宿主基础结构以解决 ASP.NET 应用程序和传统 Windows 窗体应用程序之间的关键体系结构差异。 例如,ASP.NET 应用程序可以同时为多个同步的用户提供服务。 在这种服务器环境中,应用程序的设计方式必须有效地利用可用的系统内存。 这些情况下,Windows Workflow Foundation 提供卸载工作流实例的 SqlWorkflowPersistenceService 服务。 另外,ASP.NET 在收到请求时会发出响应。 默认情况下,工作流运行时以异步方式执行工作流。 因此,可能会在工作流完成之前呈现页面和发送响应。 为了避免这种情况,Windows Workflow Foundation 提供 ManualWorkflowSchedulerService 服务以便同步运行工作流。 这使您的 Web 窗体能够将工作流状态信息返回给用户。

创建 WorkflowRuntime 对象

使用 ASP.NET 中的 Global.asax 文件可以处理与开始和结束 Web 应用程序时引发的各个 Web 会话或事件相关的 Web 窗体事件。 ASP.NET 中的 Session 对象是为每个请求 Web 页的用户创建的,Application 对象是在每个会话中共享的单个对象。 下面的示例演示如何处理 Application_Start 事件以创建 WorkflowRuntime 实例和添加 ManualWorkflowSchedulerService。 完成此操作后,通过使用 StartRuntime 方法启动运行时,您可以将 WorkflowRuntime 实例保存到随 ASP.NET 一起提供的 Application 对象中。 在以后对应用程序中 Web 页的请求中,您可以检索此单个 WorkflowRuntime 实例以启动工作流。

C#  CopyCode image复制代码
void Application_Start(object sender, EventArgs e)
            {
            System.Workflow.Runtime.WorkflowRuntime workflowRuntime =
            new System.Workflow.Runtime.WorkflowRuntime();
            System.Workflow.Runtime.Hosting.ManualWorkflowSchedulerService manualService =
            new System.Workflow.Runtime.Hosting.ManualWorkflowSchedulerService();
            workflowRuntime.AddService(manualService);
            workflowRuntime.StartRuntime();
            Application["WorkflowRuntime"] = workflowRuntime;
            }

当应用程序完成时,ASP.NET 引发 Application_End 事件。 下面的代码演示如何检索在 Application_Start 事件期间创建的 WorkflowRuntime 对象,以便调用 StopRuntime 方法。

C#  CopyCode image复制代码
void Application_End(object sender, EventArgs e)
            {
            System.Workflow.Runtime.WorkflowRuntime workflowRuntime =
            Application["WorkflowRuntime"] as System.Workflow.Runtime.WorkflowRuntime;
            workflowRuntime.StopRuntime();
            }

在 ASP.NET Web 窗体中启动工作流

在上一节中,在 Application_Start 事件期间创建了 WorkflowRuntime 实例。 在 Web 应用程序处理请求时,会一直保留此对象。 下面的代码演示如何从 ASP.NET 中的 Application 对象中检索 WorkflowRuntime 实例。 之后,使用 GetService 方法检索用于启动工作流的 ManualWorkflowSchedulerService,以便同步运行工作流。 为此,调用在 WorkflowRuntime 类中定义的 CreateWorkflow 方法,随后调用从 CreateWorkflow 调用中返回的 WorkflowInstance 对象中的 Start 方法。 由于将 ManualWorkflowSchedulerService 添加到了 WorkflowRuntime,因此调用 RunWorkflow 方法,传递 WorkflowInstance 对象的 InstanceId

C#  CopyCode image复制代码
protected void StartRuntime_Click(object sender, EventArgs e)
            {
            WorkflowRuntime workflowRuntime = Application["WorkflowRuntime"] as WorkflowRuntime;
            ManualWorkflowSchedulerService manualScheduler =
            workflowRuntime.GetService(typeof(ManualWorkflowSchedulerService))
            as ManualWorkflowSchedulerService;
            WorkflowInstance instance = workflowRuntime.CreateWorkflow(
            typeof(ASPNetSequentialWorkflow));
            instance.Start();
            manualScheduler.RunWorkflow(instance.InstanceId);
            }
只有注册用户登录后才能发表评论。