专著于富媒体技术~
本站某些作品来源于互联网,如果侵犯了您的利益,请留言说明!
本站某些作品来源于互联网,如果侵犯了您的利益,请留言说明!
本文以.NET平台下C#语言开发的WebService作为远程数据源,详细介绍Flex与.NET的WebService的数据通信知识点;包括连接WebService,远程调用WebService方法,给WebService方法传递参数等相关知识点。三个标签的使用方法基本上是一样,这里就以<mx:WebService>标签为例进行介绍。
首先看看如下代码块:
<mx:WebService id="dataService"
wsdl="http://localhost/FlashFlex/DataWebService.asmx?wsdl"
useProxy="false">
<mx:operation name="HelloWorld" result="onSuccess(event)" fault="onFault(event)"/>
<mx:operation name="GetBook" fault="onFault(event)" result="onObjectSuccess(event)"/>
</mx:WebService>
wsdl="http://localhost/FlashFlex/DataWebService.asmx?wsdl"
useProxy="false">
<mx:operation name="HelloWorld" result="onSuccess(event)" fault="onFault(event)"/>
<mx:operation name="GetBook" fault="onFault(event)" result="onObjectSuccess(event)"/>
</mx:WebService>
wsdl属性指定到要访问的WebService的wsdl地址既可,其中定义了两个操作标签(<mx:operation>),分别对应于WebService中定义的WebMethod方法。result属性标记访问WebService方法成功后的处理函数;fault则相反,指定于访问失败的处理函数。以上两个<mx:operation>对应于WebService的WebMethod方法如下:
/// <summary>
/// 返回字符串
/// </summary>
/// <returns></returns>
[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
/// <summary>
/// 返回一个简单对象
/// </summary>
/// <returns></returns>
[WebMethod]
public Book GetBook()
{
return new Book
{
Id = 1,
Name = "三国演义",
Author = "罗贯中",
Price = 100
};
}
如上便是WebService方法定义和在Flex的客户端(mxml)通过<mx:WebService>标签来访问WebService的完整流程,下面我们来看看在Flex的客户端怎么去调用WebService所定义的方法:
<mx:Script>
<![CDATA[
import mx.controls.Alert;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
/**
* 向WebService发起请求--调用HelloWorld方法,dataService为<mx:WebService>的id
* */
internal function onRequest():void
{
dataService.HelloWorld();
}
/**
* 请求成功处理返回结果
* */
internal function onSuccess(evt:ResultEvent):void
{
Alert.show(evt.result.toString());
}
/**
* 请求失败的处理函数
* */
internal function onFault(evt:FaultEvent):void
{
Alert.show("访问WebService失败!");
}
]]>
</mx:Script>
通过上面的调用,就可以完成一个Flex和.NET WebService的交互。当然我们在Flash/Flex的客户端调用WebService也是可以传递参数的,如下WebService的WebMethod定义:
/// <summary>
/// 将传递进来的参数转化为大写字符返回
/// </summary>
/// <param name="value"></param>
/// <returns></returns>
[WebMethod]
public string ConvertToUpper(string value)
{
return value.ToUpper();
}
通过在<mx:WebService>标签下配置<mx:operation>执行该方法就可以访问了,如下:
<mx:operation name="ConvertToUpper" result="onSuccess(event)" fault="onFault(event)"/>
/**
* 向WebService发起请求
* */
internal function onRequest():void
{
//dataService.HelloWorld();
dataService.ConvertToUpper("abcdefg");
}
另外,我们还可以通过<mx:request>来传递参数,这里只需要知道<mx:request></mx:request>里的参数配置与WebService提供的WebMethod方法参数同名就OK。
回到前面看看WebService的方法定义,其中一个方法GetBook是返回的一个Book对象,如果是返回的对象我们在Flex的客户端怎么来获取这个对象的值呢?详细见如下代码示例:
internal function onObject():void
{
dataService.GetBook();
}
internal function onObjectSuccess(evt:ResultEvent):void
{
//直接通过事件的result属性得到返回值,然后直接访问属性便OK
Alert.show(evt.result.Name);
}
/**
* 请求失败的处理函数
* */
internal function onFault(evt:FaultEvent):void
{
Alert.show("访问WebService失败!");
}
{
dataService.GetBook();
}
internal function onObjectSuccess(evt:ResultEvent):void
{
//直接通过事件的result属性得到返回值,然后直接访问属性便OK
Alert.show(evt.result.Name);
}
/**
* 请求失败的处理函数
* */
internal function onFault(evt:FaultEvent):void
{
Alert.show("访问WebService失败!");
}
如上便完成了服务端的WebService返回对象到客户端的调用。
实际上我们也可以通过编程的方式动态的访问WebService,Flex SDK为我们提供了WebService类。
使用WebService类来访问WebService其实也就是将<mx:WebService>标签的属性通过类对象的属性形式来表示,相比之下使用WebService类比使用<mx:WebService>标签要灵活。下面我们来看看编程方式怎么连接和调用远程方法:
internal function onClick():void
{
var service:WebService = new WebService();
service.loadWSDL("http://localhost:1146/FlashFlexService.asmx?wsdl");
service.addEventListener(ResultEvent.RESULT,onResult);
service.addEventListener(FaultEvent.FAULT,onFault);
service.GetBook();
}
直接通过类对象的loadWSDL()方法调用远程WebService,动态为类对象指定相关的处理函数,然后和标签一样调用远程WebService方法既可。
internal function onResult(evt:ResultEvent):void
{
Alert.show(evt.result.Id);
}
internal function onFault(evt:FaultEvent):void
{
Alert.show(evt.fault.faultDetail.toString());
}
{
Alert.show(evt.result.Id);
}
internal function onFault(evt:FaultEvent):void
{
Alert.show(evt.fault.faultDetail.toString());
}
如上便完成了使用WebService类通过编程的方式访问远程WebService方法的调用。
下面来看看WebService返回DataTable等负责类型,在Flex客户端该怎么解析。首先定义WebService方法如下:
[WebMethod(Description="该方法将返回DataTable类型的数据")]
public DataTable GetDataTable()
{
DataTable dt = new DataTable("Books");
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Author", typeof(string));
dt.Columns.Add("Price", typeof(double));
DataRow dr = dt.NewRow();
dr["Id"] = 1;
dr["Name"] = "《Flex游戏开发》";
dr["Author"] = "张三";
dr["Price"] = 54.85;
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["Id"] = 2;
dr["Name"] = "《Flash游戏开发》";
dr["Author"] = "李四";
dr["Price"] = 65.50;
dt.Rows.Add(dr);
return dt;
}
public DataTable GetDataTable()
{
DataTable dt = new DataTable("Books");
dt.Columns.Add("Id", typeof(int));
dt.Columns.Add("Name", typeof(string));
dt.Columns.Add("Author", typeof(string));
dt.Columns.Add("Price", typeof(double));
DataRow dr = dt.NewRow();
dr["Id"] = 1;
dr["Name"] = "《Flex游戏开发》";
dr["Author"] = "张三";
dr["Price"] = 54.85;
dt.Rows.Add(dr);
dr = dt.NewRow();
dr["Id"] = 2;
dr["Name"] = "《Flash游戏开发》";
dr["Author"] = "李四";
dr["Price"] = 65.50;
dt.Rows.Add(dr);
return dt;
}
同样在Flex客户端通过WebService来访问就可以了,下面是使用<mx:WebServive>标签访问(这里需要注意,<mx:operation>标签的name必须与服务端的WebService方法同名):
<mx:WebService id="myService"
wsdl="http://localhost:1146/DataWebService.asmx?wsdl" useProxy="false">
<mx:operation name="GetDataTable">
</mx:operation>
</mx:WebService>
提供好了WebService,客户端也连接上了WebService,现在只差调用WebService提供的远程方法了。如下:
internal function onTable():void
{
myService.addEventListener(ResultEvent.RESULT,onSuccess);
myService.addEventListener(FaultEvent.FAULT,onFault);
myService.GetDataTable.send();
}
internal function onSuccess(evt:ResultEvent):void
{
//bookGrid.dataProvider=this.myService.GetDataTable.lastResult.Tables.Books.Rows;
}
internal function onFault(evt:FaultEvent):void
{
Alert.show("调用WebService方法失败,详细:" + evt.fault.faultDetail.toString());
}
将WebService的返回值绑定在Flex的DataGrid组件,mxml的相关代码如下:
<mx:Panel x="41" y="123" width="480" height="279" layout="absolute" fontSize="12">
<mx:DataGrid x="10" y="10" width="436" id="bookGrid"
dataProvider="{this.myService.GetDataTable.lastResult.Tables.Books.Rows}">
<mx:columns>
<mx:DataGridColumn headerText="编号" dataField="Id"/>
<mx:DataGridColumn headerText="书名" dataField="Name"/>
<mx:DataGridColumn headerText="作者" dataField="Author"/>
<mx:DataGridColumn headerText="价格" dataField="Price"/>
</mx:columns>
</mx:DataGrid>
<mx:ControlBar>
<mx:Button label="DataTable" click="onTable()"/>
</mx:ControlBar>
</mx:Panel>
通过DataGrid的dataProvider属性绑定DataGrid组件的数据源,除了直接通过"{}"绑定表达式帮定外我们也可以在调用远程方法成功的处理函数里给DataGrid指定数据源,见上面代码中注释的代码部分。{this.myService.GetDataTable.lastResult.Tables.Books.Rows}表示将远程WebService方法GetDataTable()的返回结果(DataTable)的所有行作为数据源与DataGrid组件进绑定,其中Books为数据源DataTable的name,详细见前面WebService方法的定义出。程序运行结果如下图:
DataSet,DataTable相比泛型集合来说,性能上有很大的差距,复杂的序列化和反序列化过程也很负责,自从.net 2.0推出泛型到现在,我一直就比较喜欢用泛型来传递大数据。OK,下面我将介绍下在Flex中怎么去处理WebService方法返回的泛型集合数据。我们有如下WebService方法定义:
[WebMethod(Description="该方法返回泛型集合")]
public List<Book> BookList()
{
return new List<Book>
{
new Book
{
Id = 1,
Name = "《Flex游戏开发》",
Author = "张三",
Price = 54.85
},
new Book
{
Id = 1,
Name = "《Flash游戏开发》",
Author = "李四",
Price = 65.50
}
};
}
public List<Book> BookList()
{
return new List<Book>
{
new Book
{
Id = 1,
Name = "《Flex游戏开发》",
Author = "张三",
Price = 54.85
},
new Book
{
Id = 1,
Name = "《Flash游戏开发》",
Author = "李四",
Price = 65.50
}
};
}
相比DataSet,DataTable类型,使用List<>返回数据我个人认为更方面容易处理。我们直接在WebService的调试环境下测试返回List<>的WebService方法可以看到如下结果:
这就是以泛型结合(List<>)的形式返回的数据形式,相比DataTable的返回结果更为简洁,明了。话说到此,我们在Flex下该怎么去获取这个返回值和处理这个值呢?其实这里已经很清楚的展现了我们可以通过什么方式去处理,仔细看上图会发现"ArrayOfBook"????这是什么东西?莫非是在客户端可以通过数组的形式得到这个返回值。为了进一步搞清楚这里面的的点点滴滴,我们需要深入到内部去了解下返回值的具体构造,通过Flex Builder的调试环境可以得到如下信息:
看清楚了吗?BookList方法的lastResult结构集下有两个对象,点开节点可知正是我们通过List<Book>返回的两个Book对象,而lastResult的类型是:mx.collections.ArrayCollection,这不真是ActionScript中的数组集合吗?好的,既然这样,在Flex客户端便可以直接通过lastResult得到WebService返回的泛型集合数据了。如下代码块:
internal function onTable():void
{
myService.addEventListener(ResultEvent.RESULT,onSuccess);
myService.addEventListener(FaultEvent.FAULT,onFault);
myService.BookList.send();
}
internal function onSuccess(evt:ResultEvent):void
{
var arrC:ArrayCollection = this.myService.BookList.lastResult as ArrayCollection;
bookGrid.dataProvider=arrC;
}
internal function onFault(evt:FaultEvent):void
{
Alert.show("调用WebService方法失败,详细:" + evt.fault.faultDetail.toString());
}
对应的mxml代码如下(运行结果和上面返回DataTable类型一样):
<mx:Panel x="41" y="123" width="480" height="279" layout="absolute" fontSize="12">
<mx:DataGrid x="10" y="10" width="436" id="bookGrid">
<mx:columns>
<mx:DataGridColumn headerText="编号" dataField="Id"/>
<mx:DataGridColumn headerText="书名" dataField="Name"/>
<mx:DataGridColumn headerText="作者" dataField="Author"/>
<mx:DataGridColumn headerText="价格" dataField="Price"/>
</mx:columns>
</mx:DataGrid>
<mx:ControlBar>
<mx:Button label="DataTable" click="onTable()"/>
</mx:ControlBar>
</mx:Panel>
关于WebService的数据访问就介绍到这里,由于个人能力有限,文中有不足之处还望大家指正。如果有什么好的建议也可以提出,大家相互讨论,学习,共同进步!!
出处:Bēniaǒ成长笔记
转载时必须以链接形式注明出处及本声明!
牛C网推荐您再看看以下日志:
深入理解.NET内存回收机制
Asp.net(C#)多文件上传
从 PHP 迁移到 ASP.NET(2)
.NET中的密码学--对称加密
数据库连接类DB.cs
一目了然,让你了解ADO.NET的命名规则
ASP.NET 2.0移动开发之定义设备筛选器
经验之谈-MySQL与ASP.NET配合更强大
asp.net2.0中读取web.config数据库连接字符串2种方法
Visual C#中用WMI控制远程计算机
深入理解.NET内存回收机制
Asp.net(C#)多文件上传
从 PHP 迁移到 ASP.NET(2)
.NET中的密码学--对称加密
数据库连接类DB.cs
一目了然,让你了解ADO.NET的命名规则
ASP.NET 2.0移动开发之定义设备筛选器
经验之谈-MySQL与ASP.NET配合更强大
asp.net2.0中读取web.config数据库连接字符串2种方法
Visual C#中用WMI控制远程计算机
上一篇



