概述:
用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。
代码:http://files.cnblogs.com/zhuqil/PersonalWebServicee.rar