文章目錄
- 步驟1
- 步驟2
- 步驟3
- 步驟4
- 運行結果如所示
- 步驟1
- 步驟2
- 步驟3
- 步驟4
- 步驟5
案例1
本文參考WF (Windows Workflow Foundation) 工作流程學習(一)一個Asp.Net狀態機器驗證程式 通過本文本文的介紹,我們主要瞭解wf中的狀態機器statemachine在asp.net下的運行機制。
開發環境:win7+vs2008 sp1
步驟1
開啟VS2008,建立一個解決方案WfAndAspNet,然後在該解決方案中添加一個Asp.net web應用程式WebApplication和狀態機器工作流程庫WorkflowLibrary。如所示。
完整的解決方案。
其中AspNet和SequenceWorkflowLibrary是第二個項目用到的,這個稍後再提。
步驟2
為WorkflowLibray添加一個介面Interface1介面中只有一個方法:
string Validate(string Name);
步驟3
開啟WorkflowLibrary中的Workflow1.cs的設計檢視,在其中添加兩個狀態stateActivity1和stateActivity2,然後在Workflow1InitialState中添加EventDriven活動eventDrivenActivity1,在stateAcitvity1狀態中添加StateInitialzation活動stateInitialzationActivity1,如所示。
接著選中stateActivity2,右鍵以後會發現有“設定為初始狀態”和“設定為完成狀態”,在這裡我們選擇“設定為完成狀態”,這時候stateActivity2右上方的表徵圖會發生變化。
步驟4
雙擊eventDrivenActivity1活動,進入如下編輯檢視
在eventDrivenActivity1中添加WebServiceInput事件,將參數配置到活動中去,屬性如所示。
其中屬性中的參數,我是通過對話方塊建立的,點擊參數後面的小按鈕,會彈出下面的對話方塊,選擇“綁定到新成員”選項卡,建立屬性。配置方法如所示:
在stateInitialzationActivity1活動中添加WebServiceOutput活動,並配置屬性。如所示
雙擊webServiceOutputActivity1為這個活動添加代碼:
private void webServiceOutputActivity1_SendingOutput(object sender, EventArgs e)<br /> {<br /> string name = this.webServiceInputActivity1__Parameter_Name1;<br /> if (name == "xuwei")<br /> {<br /> this.webServiceOutputActivity1__ReturnValue_1 = "成功";<br /> }<br /> else<br /> {<br /> this.webServiceOutputActivity1__ReturnValue_1 = "失敗";<br /> }<br /> }
步驟
5
右鍵工作流程項目WorkflowLibrary-->選擇“作為Web 服務發布”,系統會自動產生一個Web Service。然後我們在asp.Net 程式中引用這個Web Service ,在Asp.Net 頁面添加幾個控制項,再編寫後台C#代碼,就可以調用這個狀態機器中的方法。
Default.aspx.cs代碼
namespace WebApplication<br />{<br /> public partial class _Default : System.Web.UI.Page<br /> {<br /> protected void Page_Load(object sender, EventArgs e)<br /> {<br /> }<br /> protected void Button1_Click(object sender, EventArgs e)<br /> {<br /> localhost.Workflow1_WebService ws = new WebApplication.localhost.Workflow1_WebService();<br /> this.Label1.Text = ws.Validate(TextBox1.Text);<br /> }<br /> }<br />}
前台代碼:
<body><br /> <form id="form1" runat="server"><br /> <p>輸入“xuwei”點擊確定則顯示成功,輸入其他點擊確定按鈕則顯示失敗</p><br /> <div><br /> <asp:TextBox ID="TextBox1" runat="server"></asp:TextBox><br /> </div><br /> <div><br /> <asp:Button ID="Button1" runat="server" Text="確定" onclick="Button1_Click" /><br /> </div></p><p> <div><br /> <asp:Label ID="Label1" runat="server"></asp:Label><br /> </div><br /> </form><br /></body>
運行結果如所示
案例2
參考WF (Windows Workflow Foundation) 工作流程學習(二)一個Asp.Net與順序工作流程結合的例子
步驟1
在WfAndAspNet解決方案中添加asp.net web應用程式AspNet以及一個順序工作流程庫SequenceWorkflowLibrary
步驟2
為AspNet應用程式添加順序工作流程庫SequenceWorkflowLibrary的引用以及對workflow程式集的引用,如所示
步驟3
向Web.Config 中加入WF的註冊。
<?xml version="1.0"?><br /><configuration><br /><configSections><br /><!--WF註冊服務--><br /><section name="WorkflowRuntime" type="System.Workflow.Runtime.Configuration.WorkflowRuntimeSection, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/><br /><!--結束WF註冊服務--><br /></configSections><br /><!--WF註冊服務--><br /><WorkflowRuntime Name="WorkflowServiceContainer"><br /><Services><br /><add type="System.Workflow.Runtime.Hosting.ManualWorkflowSchedulerService, System.Workflow.Runtime, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/><br /><add type="System.Workflow.Runtime.Hosting.DefaultWorkflowCommitWorkBatchService, System.Workflow.Runtime, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/><br /></Services><br /></WorkflowRuntime><br /><!--結束WF註冊服務--><br /><appSettings/><br /><connectionStrings/></p><p></configuration><br />
步驟4
添加一個全域Global.asax 檔案,添加如下代碼
namespace AspNet<br />{<br /> public class Global : System.Web.HttpApplication<br /> {<br /> //負責wf在asp.net下的寄宿工作。<br /> protected void Application_Start(object sender, EventArgs e)<br /> {<br /> //讀取web.config中的配置資訊來建立執行個體<br /> //<section name="WorkflowRuntime" type="System.Workflow.Runtime.Configuration.WorkflowRuntimeSection, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" /><br /> WorkflowRuntime workflowRuntime = new WorkflowRuntime("WorkflowRuntime");<br /> workflowRuntime.StartRuntime();//啟動工作流程運行時<br /> //指定當前工作流程運行時<br /> Application["WorkflowRuntime"] = workflowRuntime;<br /> }<br /> protected void Session_Start(object sender, EventArgs e)<br /> {<br /> //擷取應用程式的目前狀態。<br /> WorkflowRuntime workflowRuntime = Application["WorkflowRuntime"] as WorkflowRuntime;<br /> //關閉工作流程運行時<br /> workflowRuntime.StopRuntime();<br /> }<br /> }<br />}
步驟5
向SequenceWorkflowLibrary中的workflow1.cs中添加一個代碼活動,如所示
雙擊代碼活動,添加該活動所對應的代碼
namespace SequenceWorkflowLibrary<br />{<br /> public sealed partial class Workflow1 : SequentialWorkflowActivity<br /> {<br /> public string Name { get; set; }<br /> public string Result { get; set; }<br /> public Workflow1()<br /> {<br /> InitializeComponent();<br /> }<br /> private void codeActivity1_ExecuteCode(object sender, EventArgs e)<br /> {<br /> Result = "hello " + Name;<br /> }<br /> }<br />}<br />
步驟6
前台代碼Default.aspx
<body><br /><form id="form1" runat="server"><br /><div><br /><asp:TextBox ID="TextBox1" runat="server"></asp:TextBox><br /><asp:Button ID="Button1" runat="server" Text="Button" onclick="Button1_Click" /><br /><asp:Label ID="Label1" runat="server" Text="Label"></asp:Label><br /></div><br /></form><br /></body>
後台代碼Default.aspx.cs
namespace AspNet<br />{<br /> public partial class _Default : System.Web.UI.Page<br /> {<br /> string Result = string.Empty;//全域變數<br /> protected void Page_Load(object sender, EventArgs e)<br /> {<br /> }<br /> //按鈕觸發工作流程事件。點擊按鈕以後的工作全部交給工作流程完成。<br /> protected void Button1_Click(object sender, EventArgs e)<br /> {<br /> StartWorkflow();<br /> Label1.Text = Result;<br /> }<br /> private void StartWorkflow()<br /> {<br /> //擷取當前工作流程運行時<br /> WorkflowRuntime workflowRuntime = Application["WorkflowRuntime"] as WorkflowRuntime;<br /> //動態運用ManualWorkflowSchedulerService,以取得不同的Thread作服務<br /> ManualWorkflowSchedulerService scheduler = workflowRuntime.GetService(typeof(ManualWorkflowSchedulerService)) as ManualWorkflowSchedulerService;<br /> //載入WorkflowCompleted的事件驅動,這是指工作流程完成以後才會去執行的動作。現在工作流程正在運行,所以還沒有執行。<br /> workflowRuntime.WorkflowCompleted+=new EventHandler<WorkflowCompletedEventArgs>(workflowRuntime_WorkflowCompleted);<br /> //建立Dictionary工作流程參數<br /> Dictionary<String, Object> wfPara = new Dictionary<string, object>();<br /> //添加屬性值<br /> wfPara.Add("Name", TextBox1.Text);<br /> //建立工作流程執行個體,並傳遞參數給工作流程執行個體。<br /> WorkflowInstance workflowInstance = workflowRuntime.CreateWorkflow(typeof(SequenceWorkflowLibrary.Workflow1),wfPara);<br /> //啟動工作流程執行個體<br /> workflowInstance.Start();<br /> //調度工作流程執行個體,並發布該工作流程<br /> scheduler.RunWorkflow(workflowInstance.InstanceId);<br /> }<br /> //WorkflowCompleted的事件驅動<br /> void workflowRuntime_WorkflowCompleted(object sender,WorkflowCompletedEventArgs e)<br /> {<br /> if(e.OutputParameters.ContainsKey("Result"))//如果輸出參數中還有鍵為Result的參數<br /> {<br /> Result=(string)e.OutputParameters["Result"];//則將該鍵所對應的值賦予變數Result<br /> }<br /> }<br /> }<br />}<br />
最後程式介面如所示: