概述:
用WF也可以處理網站的業務邏輯,有一個非常好的開源項目:Dropthings,它就是用WF去處理網站的業務邏輯的。這篇文章中,我也將 實現一個站點,這個站點使用WF4去處理復雜的業務邏輯。
首先說明一下這個程序的主要功能。日常生活中,我們會大量的使用webservice。比如查天氣預報、查看火車時刻表、航班等等。這個 程序是把你自己常用的webservice放在一起,共你使用。在大家的網站中可能有一樣的功能了,不過你們實現此類似的功能一般都是通過硬 編碼去實現的。這篇文章中,我將通過WF4是實現一個可定制化的、通用的、個性化的、動態的WebService服務程序,下面先看效果。
效果:
啟動頁面:這裡我提供三個方法供你調用,第一個是檢測QQ是否在線,第二個是根據城市查詢天氣預報,第三個是根據站名查詢火車時 刻表,如下圖所示。
根據選擇動態的生成webserivice需要的參數表單頁面:選擇查詢火車時刻表這項服務動態生成調用頁面,如下圖。
調用WebService:填寫需要的參數,查詢深圳到上海的火車,點擊提交。
查詢深圳的天氣情況:
查詢一個QQ號碼是否在線:
優點:
之所以用WF4去做,因為有2個很大的優點。
首先:當你將WebService引入到你的Visual Studio中之後,生成一下 ,WebService公布的方法就變成了WF4中的活動,你可以在WF4設計器上任你設計了。例如下圖:我在WF4應用程序中引入了4個網絡上的 WebService,必須先生成一下,然後在工具欄上就顯示了這4個webserivice中的所有方法:
在上圖中Visual Studio中引入4個webserivice。
上圖是圖一中引入的Webserivice中的所有方法。
其次:通過強大的WF4流程設計器去設計業務邏輯。這裡我以簡單的QQ狀態查詢為例。
本程序中QQ在線的Web Service地址是http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx,引用這個webservice之後, 編譯一下,在工具欄上回多出一個qqCheckOnline活動,我們將其拖放到flowchart工作流設計器上,如下圖,在屬性框上我們可以看到這個 WebService服務中qqCheckOnline方法需要的參數和它的返回值。
它需要輸入參數:QQ號碼 String,默認QQ號碼:8698053。返回數據:String,Y = 在線;N = 離線;E = QQ號碼錯誤;A = 商業用戶 驗證失敗;V = 免費用戶超過數量。
它只返回Y、N、E、A、V,WF4需要實現一個簡單的業務轉換,將Y、N、E、A、V轉換成在線、離線、QQ號碼錯誤、商業用戶驗證失敗、免 費用戶超過數量。下面我使用一個WF4內置的一個Switch活動實現這個轉換,如下圖。
上面是WF4的兩個很大的優點。
關鍵點:
下面我將敘述一下實現的關鍵點:
1、aspx的頁面時動態生成的,如果你想添天其他的webserivice,你只要修改處理業務的WF4的流程即可。如果WF4流程存放在DB中,可 以無需編譯。動態表單生成的代碼如下:
private void CreateControl()
{
if (ViewState["CreateControl"] == null) return;
//獲取webserivice中方法的基本信息
Dictionary<string, object> workflowParam = new Dictionary<string, object>();
Dictionary<string, string> commandParam = new Dictionary<string, string>();
commandParam.Add("commandName", "getServiceBaseInfo");
commandParam.Add("serviceName", ddlServiceName.Text);
workflowParam.Add("commandParam", commandParam);
IDictionary<string, object> result = WorkflowInvoker.Invoke(new MainFlowChart(), workflowParam);
//創建參數表單
string[] services = result["resultString"].ToString().Split(';');
resultString.Value = result["resultString"].ToString();
string[] param1 = services[0].Split(':');
string[] param2 = param1[1].Split(',');
for (int x = 0; x < param2.Length; x++)
{
//創建新一行
TableRow row = new TableRow();
//創建一個單元格存放label
TableCell cell = new TableCell();
//創建一個單元格存放TextBox
TableCell cell2 = new TableCell();
//創建一個label
Label lb = new Label();
lb.Text = param2[x];
//創建一個textbox
TextBox tb = new TextBox();
tb.ID = param2[x];
cell.Controls.Add(lb);
cell2.Controls.Add(tb);
row.Cells.Add(cell);
row.Cells.Add(cell2);
HolderTable.Rows.Add(row);
}
//創建提交按鈕
TableRow rowbtn = new TableRow();
TableCell cellbtn = new TableCell();
Button btnOK = new Button();
//綁定button事件
btnOK.Click += new EventHandler(bt_Click);
btnOK.Text = "提交";
cellbtn.Controls.Add(btnOK);
rowbtn.Cells.Add(cellbtn);
HolderTable.Rows.Add(rowbtn);
}
2、WF4流上面有4個分支。
第一個分支用於獲取所有的WebService的名字。
第二個分支用於根據服務中的方法名字,獲取WebService中方法的參數和返回值的類型,在aspx端根據這些數據來動態生成表單頁面。
第三個分支用於調用QQ是否在線webservice中的方法。
第四個分支用於調用根據城市名獲取webserivice的方法
第五個分支用於調用火車時刻表的方法。
如果你想增加調用查看飛機航班的wenserivice服務,那就很簡單了,增加一個分支就差不多了。無需改動aspx頁面的代碼。
整個處理邏輯如下圖:
WebService調用:
上圖的就是我們的個性化的WebService。看下我們如何去調用這個包含其他很多其他WebService的服務。
得到QQ在線狀態:
Dictionary<string, string> commandParam = new Dictionary<string, string>();
commandParam.Add("commandName", "qqCheckOnline");
commandParam.Add("QQCode", "394403011");
workflowParam.Add("commandParam", commandParam);
IDictionary<string, object> result = WorkflowInvoker.Invoke(new MainFlowChart(), workflowParam);
火車時刻查詢:
Dictionary<string, string> commandParam = new Dictionary<string, string>();
commandParam.Add("commandName", "qqCheckOnline");
commandParam.Add("StartStation", "深圳");
commandParam.Add("ArriveStation", "上海");
commandParam.Add("UserID", "");
workflowParam.Add("commandParam", commandParam);
IDictionary<string, object> result = WorkflowInvoker.Invoke(new MainFlowChart(), workflowParam);
總結:
主要是想演示一下用WF如何去處理網站的業務邏輯。這篇文章首先教你如何在wf4中調用webserivice;還有使用WF4對調用web serivice 的結果進行了處理,如果你有興趣,不寫代碼將調用天氣預報的webserivice的結果在WF4設計器中進行處理一下;還有就是簡單的動態表單 個構建;還有就是這個程序將多個webserivice聚合在一起,實現了個性化的webserivice;還可以將這個處理邏輯放在wf4的 wcf服務中, 將其發布成一個真正的webserivice。
本文配套源碼