ASP.NET工作流的創建與啟動
創建 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 窗體能夠將工作流狀態信息返回給用戶。
ASP.NET工作流的創建:創建 WorkflowRuntime 對象
使用 ASP.NET 中的 Global.asax 文件可以處理與開始和結束 Web 應用程序時引發的各個 Web 會話或事件相關的 Web 窗體事件。 ASP.NET 中的 Session 對象是為每個請求 Web 頁的用戶創建的,Application 對象是在每個會話中共享的單個對象。 下面的示例演示如何處理 Application_Start 事件以創建 WorkflowRuntime 實例和添加 ManualWorkflowSchedulerService。 完成此操作后,通過使用 StartRuntime 方法啟動運行時,您可以將 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 方法。
- void Application_End(object sender, EventArgs e)
- {
- System.Workflow.Runtime.WorkflowRuntime workflowRuntime =
- Application["WorkflowRuntime"] as System.Workflow.Runtime.WorkflowRuntime;
- workflowRuntime.StopRuntime();
- }
ASP.NET工作流的啟動:在 ASP.NET Web 窗體中啟動工作流
在上一節中,在 Application_Start 事件期間創建了 WorkflowRuntime 實例。 在 Web 應用程序處理請求時,會一直保留此對象。 下面的代碼演示如何從 ASP.NET 中的 Application 對象中檢索 WorkflowRuntime 實例。 之后,使用 GetService 方法檢索用于啟動工作流的 ManualWorkflowSchedulerService,以便同步運行工作流。 為此,調用在 WorkflowRuntime 類中定義的 CreateWorkflow 方法,隨后調用從 CreateWorkflow 調用中返回的 WorkflowInstance 對象中的 Start 方法。 由于將 ManualWorkflowSchedulerService 添加到了 WorkflowRuntime,因此調用 RunWorkflow 方法,傳遞 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);
- }
以上就介紹了ASP.NET工作流的創建與啟動。
【編輯推薦】