ASP.NET工作流的創(chuàng)建與啟動(dòng)
創(chuàng)建 Windows Workflow Foundation 是為了在不同的宿主應(yīng)用程序環(huán)境中運(yùn)行。 ASP.NET Web 窗體就是一種這樣的支持環(huán)境。 但是,當(dāng)為 Windows Workflow Foundation 創(chuàng)建基于 Web 的宿主應(yīng)用程序時(shí),必須設(shè)計(jì)宿主基礎(chǔ)結(jié)構(gòu)以解決 ASP.NET 應(yīng)用程序和傳統(tǒng) Windows 窗體應(yīng)用程序之間的關(guān)鍵體系結(jié)構(gòu)差異。 例如,ASP.NET 應(yīng)用程序可以同時(shí)為多個(gè)同步的用戶(hù)提供服務(wù)。 在這種服務(wù)器環(huán)境中,應(yīng)用程序的設(shè)計(jì)方式必須有效地利用可用的系統(tǒng)內(nèi)存。 這些情況下,Windows Workflow Foundation 提供卸載工作流實(shí)例的 SqlWorkflowPersistenceService 服務(wù)。 另外,ASP.NET 在收到請(qǐng)求時(shí)會(huì)發(fā)出響應(yīng)。 默認(rèn)情況下,工作流運(yùn)行時(shí)以異步方式執(zhí)行工作流。 因此,可能會(huì)在工作流完成之前呈現(xiàn)頁(yè)面和發(fā)送響應(yīng)。 為了避免這種情況,Windows Workflow Foundation 提供 ManualWorkflowSchedulerService 服務(wù)以便同步運(yùn)行工作流。 這使您的 Web 窗體能夠?qū)⒐ぷ髁鳡顟B(tài)信息返回給用戶(hù)。
ASP.NET工作流的創(chuàng)建:創(chuàng)建 WorkflowRuntime 對(duì)象
使用 ASP.NET 中的 Global.asax 文件可以處理與開(kāi)始和結(jié)束 Web 應(yīng)用程序時(shí)引發(fā)的各個(gè) Web 會(huì)話(huà)或事件相關(guān)的 Web 窗體事件。 ASP.NET 中的 Session 對(duì)象是為每個(gè)請(qǐng)求 Web 頁(yè)的用戶(hù)創(chuàng)建的,Application 對(duì)象是在每個(gè)會(huì)話(huà)中共享的單個(gè)對(duì)象。 下面的示例演示如何處理 Application_Start 事件以創(chuàng)建 WorkflowRuntime 實(shí)例和添加 ManualWorkflowSchedulerService。 完成此操作后,通過(guò)使用 StartRuntime 方法啟動(dòng)運(yùn)行時(shí),您可以將 WorkflowRuntime 實(shí)例保存到隨 ASP.NET 一起提供的 Application 對(duì)象中。 在以后對(duì)應(yīng)用程序中 Web 頁(yè)的請(qǐng)求中,您可以檢索此單個(gè) WorkflowRuntime 實(shí)例以啟動(dòng)工作流。
- 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;
- }
當(dāng)應(yīng)用程序完成時(shí),ASP.NET 引發(fā) Application_End 事件。 下面的代碼演示如何檢索在 Application_Start 事件期間創(chuàng)建的 WorkflowRuntime 對(duì)象,以便調(diào)用 StopRuntime 方法。
- void Application_End(object sender, EventArgs e)
- {
- System.Workflow.Runtime.WorkflowRuntime workflowRuntime =
- Application["WorkflowRuntime"] as System.Workflow.Runtime.WorkflowRuntime;
- workflowRuntime.StopRuntime();
- }
ASP.NET工作流的啟動(dòng):在 ASP.NET Web 窗體中啟動(dòng)工作流
在上一節(jié)中,在 Application_Start 事件期間創(chuàng)建了 WorkflowRuntime 實(shí)例。 在 Web 應(yīng)用程序處理請(qǐng)求時(shí),會(huì)一直保留此對(duì)象。 下面的代碼演示如何從 ASP.NET 中的 Application 對(duì)象中檢索 WorkflowRuntime 實(shí)例。 之后,使用 GetService 方法檢索用于啟動(dòng)工作流的 ManualWorkflowSchedulerService,以便同步運(yùn)行工作流。 為此,調(diào)用在 WorkflowRuntime 類(lèi)中定義的 CreateWorkflow 方法,隨后調(diào)用從 CreateWorkflow 調(diào)用中返回的 WorkflowInstance 對(duì)象中的 Start 方法。 由于將 ManualWorkflowSchedulerService 添加到了 WorkflowRuntime,因此調(diào)用 RunWorkflow 方法,傳遞 WorkflowInstance 對(duì)象的 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);
- }
以上就介紹了ASP.NET工作流的創(chuàng)建與啟動(dòng)。
【編輯推薦】