加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Flex与.NET互操作 基于WebService的数据访问

发布时间:2020-12-15 04:14:55 所属栏目:百科 来源:网络整理
导读:?????使用WebService类来访问WebService其实也就是将mx:WebService标签的属性通过类对象的属性形式来表示,相比之下使用WebService类比使用mx:WebService标签要灵活。下面我们来看看编程方式怎么连接和调用远程方法: 1 ???? internal ?function?onClick():

?????使用WebService类来访问WebService其实也就是将<mx:WebService>标签的属性通过类对象的属性形式来表示,相比之下使用WebService类比使用<mx: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,onResult);
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来访问就可以了,下面是使用<mx:WebServive>标签访问(这里需要注意,<mx:operation>标签的name必须与服务端的WebService方法同名):

1? ???? < mx:WebService?id = " myService " ?
2? ????????wsdl = " http://localhost:1146/DataWebService.asmx?wsdl " ?useProxy = " false " >
3? ???????? < mx:operation?name = " GetDataTable " >
4? ???????? </ mx:operation >
5? ???? </ mx:WebService >

?

?????提供好了WebService,客户端也连接上了WebService,现在只差调用WebService提供的远程方法了。如下:

?1???? internal ?function?onTable(): void
?2? ????{
?3? ????????myService.addEventListener(ResultEvent.RESULT,onSuccess);
?4? ????????myService.addEventListener(FaultEvent.FAULT,onFault);
?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? < mx:Panel? x ="41" ?y ="123" ?width ="480" ?height ="279" ?layout ="absolute" ?fontSize ="12" >
?2? ???? < mx:DataGrid? x ="10" ?y ="10" ?width ="436" ?id ="bookGrid" ?
?3? ????????dataProvider ="{this.myService.GetDataTable.lastResult.Tables.Books.Rows}" >
?4? ???????? < mx:columns >
?5? ???????????? < mx:DataGridColumn? headerText ="编号" ?dataField ="Id" />
?6? ???????????? < mx:DataGridColumn? headerText ="书名" ?dataField ="Name" />
?7? ???????????? < mx:DataGridColumn? headerText ="作者" ?dataField ="Author" />
?8? ???????????? < mx:DataGridColumn? headerText ="价格" ?dataField ="Price" />
?9? ???????? </ mx:columns >
10? ???? </ mx:DataGrid >
11? ???? < mx:ControlBar >
12? ???????? < mx:Button? label ="DataTable" ?click ="onTable()" />
13? ???? </ mx:ControlBar >
14? </ 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方法定义:

?

?1???? [WebMethod(Description = " 该方法返回泛型集合 " )]
?2? ???? public ?List < Book > ?BookList()
?3? ????{
?4? ???????? return ? new ?List < Book >
?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>返回的两个Book对象,而lastResult的类型是:mx.collections.ArrayCollection,这不真是ActionScript中的数组集合吗?好的,既然这样,在Flex客户端便可以直接通过lastResult得到WebService返回的泛型集合数据了。如下代码块:

?1? internal ?function?onTable(): void
?2? {
?3? ????myService.addEventListener(ResultEvent.RESULT,onSuccess);
?4? ????myService.addEventListener(FaultEvent.FAULT,onFault);
?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? < mx:Panel?x = " 41 " ?y = " 123 " ?width = " 480 " ?height = " 279 " ?layout = " absolute " ?fontSize = " 12 " >
?2? ???? < mx:DataGrid?x = " 10 " ?y = " 10 " ?width = " 436 " ?id = " bookGrid " >
?3? ???????? < mx:columns >
?4? ???????????? < mx:DataGridColumn?headerText = " 编号 " ?dataField = " Id " />
?5? ???????????? < mx:DataGridColumn?headerText = " 书名 " ?dataField = " Name " />
?6? ???????????? < mx:DataGridColumn?headerText = " 作者 " ?dataField = " Author " />
?7? ???????????? < mx:DataGridColumn?headerText = " 价格 " ?dataField = " Price " />
?8? ???????? </ mx:columns >
?9? ???? </ mx:DataGrid >
10? ???? < mx:ControlBar >
11? ???????? < mx:Button?label = " DataTable " ?click = " onTable() " />
12? ???? </ mx:ControlBar >
13? </ mx:Panel >

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读