Flex与DotNET WebService交互(2)

         上篇讲了很简单的示例,但是有好多问题值得我们去深究一下,首先看下面的代码:

 

 

 

 

代码
1 internal var employees:ArrayCollection;
2 internal function onList(event:ResultEvent):void
3 {
4     employees = new ArrayCollection();
5     employees = event.result as ArrayCollection;
6     this.dgEmployees.dataProvider = employees;
7 }

         里面有个event.result, 那么这个result到底是什么内容呢,我们需要在那一行加上断点,调试运行来看个究竟。打开Flex Builder中的Variables选项卡,可以看到如下的“大量有用信息”:

 

 

  

 

首先可以确定了event.resultmx.collections.ArrayCollection类型,里面的数据正是我们想要的,而且mx.collections.ArrayCollectionFlex中绑定数据很常用的类型。这个时候我们回过头来看一下上篇中生成的XML数据:

 

代码
 1 <?xml version="1.0" encoding="utf-8" ?> 
 2  <ArrayOfEmployee 
 3    xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance 
    xmlns:xsd=http://www.w3.org/2001/XMLSchema 
    xmlns="http://tempuri.org/">
 4    <Employee>
 5           <Id>006</Id> 
 6           <Name>Aking</Name> 
 7    </Employee>
 8    <Employee>
 9           <Id>007</Id> 
10           <Name>spoony</Name> 
11    </Employee>
12  </ArrayOfEmployee>
13  

仔细对比可以发现,XML数据中的类名称(Employee)在传到Flex端的时候被丢掉了。其实Flex并不关心WebService返回结果被序列化成什么内容,它直接访问的是WebService本身。即使不能成功序列化,照样可以访问。为了验证,下面再做一个实验。

 

首先在原来的WebService中添加一个返回类型为数组的新的WebMethod

 

代码
 1 /// <summary>
 2 /// web method used to return array
 3 /// </summary>
 4 /// <returns></returns>
 5 [WebMethod]
 6 public Employee[] arrayEmployees()
 7  {
 8       Employee[] employees = new Employee[2];
 9       employees[0= new Employee("006""Aking");
10       // To test the one-record-returned result, comment the following line. 
11        employees[1= new Employee("007""spoony");
12       return employees;
13  }

运行,使用HTTP POST 协议测试,得到一个异常信息:System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidCastException: Unable to cast object of type 'ArrayCollectionorObjectProxy.Employee[]' to type 'System.Collections.Generic.List`1[ArrayCollectionorObjectProxy.Employee]'.

 

呵呵,转换失败,其实从这个错误中还可以进行一个设想,那就是无论你的WebMethod返回类型是什么,都要转化成System.Collections.Generic.List再进行序列化。这个具体笔者并没有深究。

 

接下来继续如上篇所讲用Flex访问这个新创建的WebMethod, 结果是event.result里的内容和上篇中用返回类型为List<T>是一样的,数据自然能正常显示。如下图:

 

 

上面主要是使用了List泛型来获取数据,自然现在泛型也是面向对象开发中主要使用的东西,其实DotNET里面集合类还有很多:System.Collections 命名空间包含接口和类,这些接口和类定义各种对象(如列表、队列、位数组、哈希表和字典)的集合;System.Collections.Generic 命名空间包含定义泛型集合的接口和类,泛型集合允许用户创建强类型集合,它能提供比非泛型强类型集合更好的类型安全性和性能;System.Collections.Specialized 命名空间包含专用的和强类型的集合,例如,链接的列表词典、位向量以及只包含字符串的集合。

 

DotNETFlex结合使用的时候需要看清楚这些不同返回类型的WebMethod到底在Flex端被转化成什么类型,然后再进行相应数据处理,就不会出现问题了。典型的例子是当数据只有一条记录时,很有可能会转化成mx.utils.OjbectProxy而非mx.collections.ArrayCollection.

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

posted @ 2009-12-27 09:53  spoony  阅读(604)  评论(0编辑  收藏  举报