[转载][转载]Flex与.net互操作(三):基于WebService的

[转载][转载]Flex与.net互操作(三):基于WebService的
2011年05月11日
   在上一篇文章中介绍了通过标签来访问Webservice。实际上我们也可以通过编程的方式动态的访问WebService,Flex SDK为我们提供了WebService类。
  使用WebService类来访问WebService其实也就是将标签的属性通过类对象的属性形式来表示,相比之下使用WebService类比使用标签要灵活。下面我们来看看编程方式怎么连接和调用远程方法: 1 internal function onClick():void
  2 {
  3 var service:WebService = new WebService();
  4 service.loadWSDL("http://localhost:1146/FlashFlexService.asmx?wsdl");
  5 service.addEventListener(ResultEvent.RESULT,onResu lt);
  6 service.addEventListener(FaultEvent.FAULT,onFault) ;
  7 service.GetBook();
  8 }
  直接通过类对象的loadWSDL()方法调用远程WebService,动态为类对象指定相关的处理函数,然后和标签一样调用远程WebService方法既可。 1 internal function onResult(evt:ResultEvent):void
  2 {
  3 Alert.show(evt.result.Id);
  4 }
  5
  6 internal function onFault(evt:FaultEvent):void
  7 {
  8 Alert.show(evt.fault.faultDetail.toString());
  9 }
  如上便完成了使用WebService类通过编程的方式访问远程WebService方法的调用。
  下面来看看WebService返回DataTable等负责类型,在Flex客户端该怎么解析。首先定义WebService方法如下: 1 [WebMethod(Description="该方法将返回DataTable类型的数据")]
  2 public DataTable GetDataTable()
  3 {
  4 DataTable dt = new DataTable("Books");
  5 dt.Columns.Add("Id", typeof(int));
  6 dt.Columns.Add("Name", typeof(string));
  7 dt.Columns.Add("Author", typeof(string));
  8 dt.Columns.Add("Price", typeof(double));
  9
  10 DataRow dr = dt.NewRow();
  11 dr["Id"] = 1;
  12 dr["Name"] = "《Flex游戏开发》";
  13 dr["Author"] = "张三";
  14 dr["Price"] = 54.85;
  15 dt.Rows.Add(dr);
  16
  17 dr = dt.NewRow();
  18 dr["Id"] = 2;
  19 dr["Name"] = "《Flash游戏开发》";
  20 dr["Author"] = "李四";
  21 dr["Price"] = 65.50;
  22 dt.Rows.Add(dr);
  23
  24 return dt;
  25 }
  同样在Flex客户端通过WebService来访问就可以了,下面是使用标签访问(这里需要注意,标签的name必须与服务端的WebService方法同名): 1
  3
  4
  5
  提供好了WebService,客户端也连接上了WebService,现在只差调用WebService提供的远程方法了。如下: 1 internal function onTable():void
  2 {
  3 myService.addEventListener(ResultEvent.RESULT,onSu ccess);
  4 myService.addEventListener(FaultEvent.FAULT,onFaul t);
  5 myService.GetDataTable.send();
  6 }
  7
  8 internal function onSuccess(evt:ResultEvent):void
  9 {
  10 //bookGrid.dataProvider=this.myService.GetDataTable. lastResult.Tables.Books.Rows;
  11 }
  12
  13 internal function onFault(evt:FaultEvent):void
  14 {
  15 Alert.show("调用WebService方法失败,详细:" + evt.fault.faultDetail.toString());
  16
  17 }
  将WebService的返回值绑定在Flex的DataGrid组件,mxml的相关代码如下: 1
  2
  4
  5
  6
  7
  8
  9
  10
  11
  12
  13
  14
  通过DataGrid的dataProvider属性绑定DataGrid组件的数据源,除了直接通过"{}"绑定表达式帮定外我们也可以在调用远程方法成功的处理函数里给DataGrid指定数据源,见上面代码中注释的代码部分。{this.myService.GetDataTable.lastResult.Tables.Boo ks.Rows}表示将远程WebService方法GetDataTable()的返回结果(DataTable)的所有行作为数据源与DataGrid组件进绑定,其中Books为数据源DataTable的name,详细见前面WebService方法的定义出。程序运行结果如下图:
  
  DataSet,DataTable相比泛型集合来说,性能上有很大的差距,复杂的序列化和反序列化过程也很负责,自从.net 2.0推出泛型到现在,我一直就比较喜欢用泛型来传递大数据。OK,下面我将介绍下在Flex中怎么去处理WebService方法返回的泛型集合数据。我们有如下WebService方法定义:
  1 [WebMethod(Description="该方法返回泛型集合")]
  2 public List BookList()
  3 {
  4 return new List
  5 {
  6 new Book
  7 {
  8 Id = 1,
  9 Name = "《Flex游戏开发》",
  10 Author = "张三",
  11 Price = 54.85
  12 },
  13 new Book
  14 {
  15 Id = 1,
  16 Name = "《Flash游戏开发》",
  17 Author = "李四",
  18 Price = 65.50
  19 }
  20 };
  21 }
  相比DataSet,DataTable类型,使用List返回数据我个人认为更方面容易处理。我们直接在WebService的调试环境下测试返回List的WebService方法可以看到如下结果:
  
  这就是以泛型结合(List)的形式返回的数据形式,相比DataTable的返回结果更为简洁,明了。话说到此,我们在Flex下该怎么去获取这个返回值和处理这个值呢?其实这里已经很清楚的展现了我们可以通过什么方式去处理,仔细看上图会发现"ArrayOfBook"????这是什么东西?莫非是在客户端可以通过数组的形式得到这个返回值。为了进一步搞清楚这里面的的点点滴滴,我们需要深入到内部去了解下返回值的具体构造,通过Flex Builder的调试环境可以得到如下信息:
  
  看清楚了吗?BookList方法的lastResult结构集下有两个对象,点开节点可知正是我们通过List返回的两个Book对象,而lastResult的类型是:mx.collections.ArrayCollection,这不真是ActionScript中的数组集合吗?好的,既然这样,在Flex客户端便可以直接通过lastResult得到WebService返回的泛型集合数据了。如下代码块: 1 internal function onTable():void
  2 {
  3 myService.addEventListener(ResultEvent.RESULT,onSu ccess);
  4 myService.addEventListener(FaultEvent.FAULT,onFaul t);
  5 myService.BookList.send();
  6 }
  7
  8 internal function onSuccess(evt:ResultEvent):void
  9 {
  10 var arrC:ArrayCollection = this.myService.BookList.lastResult as ArrayCollection;
  11 bookGrid.dataProvider=arrC;
  12 }
  13
  14 internal function onFault(evt:FaultEvent):void
  15 {
  16 Alert.show("调用WebService方法失败,详细:" + evt.fault.faultDetail.toString());
  17
  18 }
  对应的mxml代码如下(运行结果和上面返回DataTable类型一样): 1
  2
  3
  4
  5
  6
  7
  8
  9
  10
  11
  12
  13
  关于WebService的数据访问就介绍到这里,由于个人能力有限,文中有不足之处还望大家指正。如果有什么好的建议也可以提出,大家相互讨论,学习,共同进步!!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值