ASP.NET中实现WWF工作流(ManualWorkflowSchedulerService)

将工作流用于 ASP.NET

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

创建 WorkflowRuntime 对象

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

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 [ http://msdn.microsoft.com/zh-cn/vbasic/system.workflow.runtime.workflowruntime.stopruntime.aspx ] 方法。

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 [ http://msdn.microsoft.com/zh-cn/vbasic/ms594876.aspx ] 方法检索用于启动工作流的 ManualWorkflowSchedulerService,以便同步运行工作流。 为此,调用在 WorkflowRuntime 类中定义的 CreateWorkflow [ http://msdn.microsoft.com/zh-cn/vbasic/ms594868.aspx ] 方法,随后调用从 CreateWorkflow 调用中返回的 WorkflowInstance [ http://msdn.microsoft.com/zh-cn/vbasic/system.workflow.runtime.workflowinstance.aspx ] 对象中的 Start [ http://msdn.microsoft.com/zh-cn/vbasic/system.workflow.runtime.workflowinstance.start.aspx ] 方法。 由于将 ManualWorkflowSchedulerService 添加到了 WorkflowRuntime,因此调用 RunWorkflow [ http://msdn.microsoft.com/zh-cn/vbasic/system.workflow.runtime.hosting.manualworkflowschedulerservice.runworkflow.aspx ] 方法,传递 WorkflowInstance 对象的 InstanceId

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);
}

请参见

参考
WorkflowRuntime [ http://msdn.microsoft.com/zh-cn/vbasic/system.workflow.runtime.workflowruntime.aspx ]
ManualWorkflowSchedulerService [ http://msdn.microsoft.com/zh-cn/vbasic/system.workflow.runtime.hosting.manualworkflowschedulerservice.aspx ]
GetService [ http://msdn.microsoft.com/zh-cn/vbasic/ms594876.aspx ]
RunWorkflow [ http://msdn.microsoft.com/zh-cn/vbasic/system.workflow.runtime.hosting.manualworkflowschedulerservice.runworkflow.aspx ]
WorkflowInstance [ http://msdn.microsoft.com/zh-cn/vbasic/system.workflow.runtime.workflowinstance.aspx ]
StartRuntime [ http://msdn.microsoft.com/zh-cn/vbasic/system.workflow.runtime.workflowruntime.startruntime.aspx ]
概念
如何:添加和移除工作流服务 [ http://msdn.microsoft.com/zh-cn/vbasic/ms735889.aspx ]
其他资源
开发 ASP.NET 工作流应用程序 [ http://msdn.microsoft.com/zh-cn/vbasic/ms734584.aspx ]
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值