WF4.0实战(二十四):WF4定制个性化的WebService

概述:

    用WF也可以处理网站的业务逻辑,有一个非常好的开源项目:Dropthings,它就是用WF去处理网站的业务逻辑的。这篇文章中,我也将实现一个站点,这个站点使用WF4去处理复杂的业务逻辑。

    首先说明一下这个程序的主要功能。日常生活中,我们会大量的使用webservice。比如查天气预报、查看火车时刻表、航班等等。这个程序是把你自己常用的webservice放在一起,共你使用。在大家的网站中可能有一样的功能了,不过你们实现此类似的功能一般都是通过硬编码去实现的。这篇文章中,我将通过WF4是实现一个可定制化的、通用的、个性化的、动态的WebService服务程序,下面先看效果。

效果:

    启动页面:这里我提供三个方法供你调用,第一个是检测QQ是否在线,第二个是根据城市查询天气预报,第三个是根据站名查询火车时刻表,如下图所示。

WF4.0实战(二十四):WF4定制个性化的WebService_第1张图片

    根据选择动态的生成webserivice需要的参数表单页面:选择查询火车时刻表这项服务动态生成调用页面,如下图。

WF4.0实战(二十四):WF4定制个性化的WebService_第2张图片

    调用WebService:填写需要的参数,查询深圳到上海的火车,点击提交。

WF4.0实战(二十四):WF4定制个性化的WebService_第3张图片

    查询深圳的天气情况:

WF4.0实战(二十四):WF4定制个性化的WebService_第4张图片

    查询一个QQ号码是否在线:

WF4.0实战(二十四):WF4定制个性化的WebService_第5张图片

优点:

    之所以用WF4去做,因为有2个很大的优点。

    首先:当你将WebService引入到你的Visual Studio中之后,生成一下,WebService公布的方法就变成了WF4中的活动,你可以在WF4设计器上任你设计了。例如下图:我在WF4应用程序中引入了4个网络上的WebService,必须先生成一下,然后在工具栏上就显示了这4个webserivice中的所有方法:

WF4.0实战(二十四):WF4定制个性化的WebService_第6张图片

    在上图中Visual Studio中引入4个webserivice。

WF4.0实战(二十四):WF4定制个性化的WebService_第7张图片

    上图是图一中引入的Webserivice中的所有方法。

    其次:通过强大的WF4流程设计器去设计业务逻辑。这里我以简单的QQ状态查询为例。

    本程序中QQ在线的Web Service地址是http://www.webxml.com.cn/webservices/qqOnlineWebService.asmx,引用这个webservice之后,编译一下,在工具栏上回多出一个qqCheckOnline活动,我们将其拖放到flowchart工作流设计器上,如下图,在属性框上我们可以看到这个WebService服务中qqCheckOnline方法需要的参数和它的返回值。

WF4.0实战(二十四):WF4定制个性化的WebService_第8张图片

    它需要输入参数: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.0实战(二十四):WF4定制个性化的WebService_第9张图片

上面是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页面的代码。

    整个处理逻辑如下图:

WF4.0实战(二十四):WF4定制个性化的WebService_第10张图片

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


原文链接: http://www.cnblogs.com/zhuqil/archive/2010/07/04/wf-web-service.html

你可能感兴趣的:(WF4.0实战(二十四):WF4定制个性化的WebService)