随笔-254  评论-3298  文章-48  trackbacks-74

Flex与.NET互操作(二):基于WebService的数据访问(上)

     Flex提供了<mx:WebService>、<mx:HTTPService>和<mx:RemoteObject>标签来直接访问远程数据,这用于与各种不同语言环境开发提供的远程服务端数据源(如WebService)进行数据交互通信显得更加容易.

     本文以.NET平台下C#语言开发的WebService作为远程数据源,详细介绍Flex与.NET的WebService的数据通信知识点;包括连接WebService,远程调用WebService方法,给WebService方法传递参数等相关知识点。三个标签的使用方法基本上是一样,这里就以<mx:WebService>标签为例进行介绍。

     首先看看如下代码块:

1     <mx:WebService id="dataService" 
2         wsdl="http://localhost/FlashFlex/DataWebService.asmx?wsdl"
3         useProxy="false">
4         <mx:operation name="HelloWorld" result="onSuccess(event)" fault="onFault(event)"/>
5         <mx:operation name="GetBook" fault="onFault(event)" result="onObjectSuccess(event)"/>
6     </mx:WebService>

 

     wsdl属性指定到要访问的WebService的wsdl地址既可,其中定义了两个操作标签(<mx:operation>),分别对应于WebService中定义的WebMethod方法。result属性标记访问WebService方法成功后的处理函数;fault则相反,指定于访问失败的处理函数。以上两个<mx:operation>对应于WebService的WebMethod方法如下:

 1     /// <summary>
 2     /// 返回字符串
 3     /// </summary>
 4     /// <returns></returns>
 5     [WebMethod]
 6     public string HelloWorld()
 7     {
 8         return "Hello World";
 9     }
10 
11     /// <summary>
12     /// 返回一个简单对象
13     /// </summary>
14     /// <returns></returns>
15     [WebMethod]
16     public Book GetBook()
17     {
18         return new Book
19         {
20             Id = 1,
21             Name = "三国演义",
22             Author = "罗贯中",
23             Price = 100
24         };
25     }

 

     如上便是WebService方法定义和在Flex的客户端(mxml)通过<mx:WebService>标签来访问WebService的完整流程,下面我们来看看在Flex的客户端怎么去调用WebService所定义的方法:

 1 <mx:Script>
 2     <![CDATA[
 3         import mx.controls.Alert;
 4         import mx.rpc.events.FaultEvent;
 5         import mx.rpc.events.ResultEvent;
 6         
 7         /**
 8          * 向WebService发起请求--调用HelloWorld方法,dataService为<mx:WebService>的id
 9          * */
10         internal function onRequest():void
11         {
12             dataService.HelloWorld();
13         }
14         
15         /**
16          * 请求成功处理返回结果
17          * */
18         internal function onSuccess(evt:ResultEvent):void
19         {
20             Alert.show(evt.result.toString());
21         }
22         
23         
24         /**
25          * 请求失败的处理函数
26          * */
27         internal function onFault(evt:FaultEvent):void
28         {
29             Alert.show("访问WebService失败!");
30         }
31     ]]>
32 </mx:Script>

 

      通过上面的调用,就可以完成一个Flex和.NET WebService的交互。当然我们在Flash/Flex的客户端调用WebService也是可以传递参数的,如下WebService的WebMethod定义:

 1     /// <summary>
 2     /// 将传递进来的参数转化为大写字符返回
 3     /// </summary>
 4     /// <param name="value"></param>
 5     /// <returns></returns>
 6     [WebMethod]
 7     public string ConvertToUpper(string value)
 8     {
 9         return value.ToUpper();
10     }

 

     通过在<mx:WebService>标签下配置<mx:operation>执行该方法就可以访问了,如下:

1 <mx:operation name="ConvertToUpper"  result="onSuccess(event)" fault="onFault(event)"/>

 

1     /**
2      * 向WebService发起请求
3      * */
4     internal function onRequest():void
5     {
6         //dataService.HelloWorld();
7         dataService.ConvertToUpper("abcdefg");
8     }


     另外,我们还可以通过<mx:request>来传递参数,这里只需要知道<mx:request></mx:request>里的参数配置与WebService提供的WebMethod方法参数同名就OK。

     回到前面看看WebService的方法定义,其中一个方法GetBook是返回的一个Book对象,如果是返回的对象我们在Flex的客户端怎么来获取这个对象的值呢?详细见如下代码示例:

 1     internal function onObject():void
 2     {
 3         dataService.GetBook();
 4     }
 5     
 6     internal function onObjectSuccess(evt:ResultEvent):void
 7     {
 8         //直接通过事件的result属性得到返回值,然后直接访问属性便OK
 9         Alert.show(evt.result.Name);
10     }
11     
12     /**
13      * 请求失败的处理函数
14      * */
15     internal function onFault(evt:FaultEvent):void
16     {
17         Alert.show("访问WebService失败!");
18     }

 

     如上便完成了服务端的WebService返回对象到客户端的调用。

版权说明

  本文属原创文章,欢迎转载,其版权归作者和博客园共有。  

  作      者:Beniao

 文章出处:http://beniao.cnblogs.com/  或  http://www.cnblogs.com/

 

posted on 2009-01-13 16:16 Bēniaǒ 阅读(9972) 评论(27) 编辑 收藏

评论:
#2楼[楼主] 2009-03-07 20:04 | Bēniaǒ      
@roadrunners
广告??

 回复 引用 查看   
#3楼 2009-04-03 12:45 | .....      
楼主
return new Book
这里Book找不到,是不是哪里还定义,能给完整的例子下载吗

 回复 引用 查看   
#4楼[楼主] 2009-05-17 15:22 | Bēniaǒ      
@.....
return new Book
这里一看就知道是怎么回事了吧.
返回一个Book对象,Book对象的定义:
public class Book
{
public int Id{get;set;}
public string Name{get;set;}
public string Author{get;set;}
pbulic double Price{get;set;}
}

 回复 引用 查看   
#5楼 2009-06-08 14:01 | 小龙龙      
试了下,怎么没有提示呢?
 回复 引用 查看   
#6楼 2009-06-14 09:49 | billmanliu
public class Book
{
public int Id{get;set;}
public string Name{get;set;}
public string Author{get;set;}
pbulic double Price{get;set;}
}
类似java bean,在vs2003中编译报以下错误
错误 1 “Book.Id.get”必须声明主体,因为它未标记为 abstract 或 extern D:\flex+net\webServices2\App_Code\Book.cs 16 16 D:\flex+net\webServices2\
错误 2 “Book.Id.set”必须声明主体,因为它未标记为 abstract 或 extern D:\flex+net\webServices2\App_Code\Book.cs 16 20 D:\flex+net\webServices2\

 回复 引用   
#7楼 2009-06-14 09:50 | billmanliu
public class Book
{
public int Id{get;set;}
public string Name{get;set;}
public string Author{get;set;}
pbulic double Price{get;set;}
}
类似java bean,在vs2005中编译报以下错误
错误 1 “Book.Id.get”必须声明主体,因为它未标记为 abstract 或 extern D:\flex+net\webServices2\App_Code\Book.cs 16 16 D:\flex+net\webServices2\
错误 2 “Book.Id.set”必须声明主体,因为它未标记为 abstract 或 extern D:\flex+net\webServices2\App_Code\Book.cs 16 20 D:\flex+net\webServices2\

 回复 引用   
#8楼[楼主] 2009-06-14 11:36 | Bēniaǒ      
@小龙龙
什么没提示?

 回复 引用 查看   
#9楼[楼主] 2009-06-14 11:39 | Bēniaǒ      
@billmanliu
上面这种写法是.net framework3.0/3.5的新特性,VS2003中你只能使用古老的写法。
private int id;
public int Id
{
get {return this.id;}
set {this.id = value;}
}

 回复 引用 查看   
#10楼 2009-07-26 01:20 | 恏學苼      
就不能给出demo吗?缺这缺那
 回复 引用 查看   
#11楼[楼主] 2009-07-26 20:07 | Bēniaǒ      
@恏學苼
不缺啊,文章中的示例代码你敲打下去是可以运行成功的。
写文章时候的示例已经早就不在了。没办法给你找一份发给你了。

 回复 引用 查看   
#12楼 2009-07-26 22:05 | 恏學苼      
照你写的敲了,运行没反应
 回复 引用 查看   
#13楼 2009-07-26 22:07 | 恏學苼      
发现是没有发送 请求的代码
 回复 引用 查看   
#14楼 2009-07-26 22:07 | 恏學苼      
就像是单击一个按钮然后激发事件,调用方法
 回复 引用 查看   
#15楼 2009-07-26 22:08 | 恏學苼      
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
	<mx:Script>
		<![CDATA[
			import mx.rpc.events.FaultEvent;
			import mx.rpc.soap.WebService;
			import mx.rpc.events.ResultEvent;
			import mx.controls.Alert;
  
			[Bindable]
			public var getresultXML:XML=new XML();       //定义一个全局变量用来接收WebService返回的XML数据
			public var islogin:Boolean=new Boolean(false);    //定义一个boolean类型的变量来判断是否登陆成功!
            
            //“重置”按钮点击事件,清空文本框  
			private function btnReset_Click():void {
				this.txtUserName.text="";
				this.txtUserPwd.text="";
			}
			//"登陆"按钮点击事件
			private function btnLogin_Click():void {
				if(this.txtUserName.text=="" || this.txtUserPwd.text=="") {
					Alert.show("用户名和密码不能为空!");
					return; 
   				}
				else {
					//把文本框里输入的信息封装到SQL语句中,并作为参数传到WebService方法里。
					var strLoginSQL:String="select * from Users where username='"+this.txtUserName.text+"' and password='"+this.txtUserPwd.text+"'";

					//调用WebService里自定义的方法getConnection(string sql)方法
					// 方法1:
					var service:WebService = new WebService();
					service.loadWSDL("http://localhost:20545/FlexWebService.asmx?WSDL");
					service.addEventListener(ResultEvent.RESULT,onResult);
					service.addEventListener(FaultEvent.FAULT,onFault);
					service.getConnection(strLoginSQL);
					// 方法2:
					//this.FlexWebService.getConnection(strLoginSQL);
				}
			}
  
			internal function onResult(event:ResultEvent):void {
				getresultXML = XML(event.result);
				if(getresultXML.toString().length>0) {
					var strNickName:String=XML(event.result.toString()).Table.NickName.toString();
					this.islogin=true;
					Alert.show("登陆成功!欢迎您"+strNickName);
				}
				else {
					Alert.show("没有查到此用户!登陆失败!");
					return;
				}
			}
			
			internal function onFault(evt:FaultEvent):void
		    {
		        Alert.show(evt.fault.faultDetail.toString());
		    }
		]]>
	</mx:Script>
	<!-- 方法2:-->
	<!--
	<mx:WebService id="FlexWebService" wsdl="http://localhost:20545/FlexWebService.asmx?WSDL"
		 useProxy="false" >
		<mx:operation name="HelloWorld" />
		<mx:operation name="getConnection" fault="onFault(event)" result="onResult(event)"/>
	</mx:WebService>
	-->
	<mx:Panel x="201.5" y="104" width="293" height="189" layout="absolute" id="loginPanal" title="登陆面板" status="Design By Eule">
		<mx:Label x="18" y="24" text="邮件地址:" fontSize="12"/>
		<mx:Label x="18" y="50" text="登陆密码:" fontSize="12"/>
		<mx:TextInput x="91" y="24" id="txtUserName"/>
		<mx:TextInput x="91" y="50" id="txtUserPwd"/>
		<mx:Button x="91" y="80" label="登陆" id="btnLogin" click="btnLogin_Click()"/>
		<mx:Button x="147" y="80" label="重置" id="btnReset" click="btnReset_Click()"/>
	</mx:Panel>
</mx:Application>

 回复 引用 查看   
#16楼 2009-07-26 22:09 | 恏學苼      
后来找了篇文章,还是谢谢你的文章
 回复 引用 查看   
#17楼 2009-07-26 22:10 | 恏學苼      
还是建议以后写文章,给出demo,这样方便点,至少给初学者很大帮助,能找出问题在哪
 回复 引用 查看   
#18楼[楼主] 2009-07-28 16:44 | Bēniaǒ      
@恏學苼
这个实例很简单我所有没上传示例代码供下载。

 回复 引用 查看   
#19楼 2009-10-14 21:28 | FISHFISH[未注册用户]
你好,能帮我看个这个问题吗?
http://bbs.airia.cn/Fluorine_remoting/thread-7952-1-1.aspx

 回复 引用   
#20楼 2010-02-15 10:44 | jonkiky      
什么没提示?
 回复 引用 查看   
#21楼[楼主] 2010-02-24 10:08 | Bēniaǒ      
@jonkiky
看不懂你的意思。

 回复 引用 查看   
#22楼 2011-06-22 15:18 | yaesut[未注册用户]
老大,你的实例对于初学者来说,确实有点头痛,总是写得不完整.下面是这个DEMO我改成功后的结果:
webService1.asmx:
public class WebService1 : System.Web.Services.WebService
{
[WebMethod]
public string HelloWorld()
{
return "Hello World";
}
[WebMethod]
public Book GetBook()
{
Book book = new Book() { ID = 1, Name = "《FLEX实验》", Author = "ROSIU", Price = 88.80 };
return book;
}
public class Book
{
public int ID { get; set; }
public string Name { get; set; }
public string Author { get; set; }
public double Price { get; set; }
}
}

 回复 引用   
#23楼 2011-06-22 15:18 | yaesut[未注册用户]
以下是demo.mxml代码:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:WebService id="dataService" wsdl="http://localhost:3035/WebService1.asmx?wsdl"
useProxy="false">
<mx:operation name="HelloWorld" result="onSuccess(event)"
fault="onFault(event)">
</mx:operation>
<mx:operation name="GetBook" fault="onFault(event)"
result="onObjectSuccess(event)"/>
</mx:WebService>
<mx:Script>
<![CDATA[
import mx.rpc.Fault;
import mx.controls.Alert;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
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失败!");
}

internal function onObject():void
{
dataService.GetBook();
}

internal function onObjectSuccess(evt:ResultEvent):void
{
Alert.show(evt.result.Name);
}
]]>
</mx:Script>
<mx:Button id="btnHello" label="CALLHELLO" click="onRequest()" x="142" y="137"></mx:Button>
<mx:Button x="289" y="135" label="GETBOOK" fontSize="12" click="onObject()"/>
</mx:Application>
注:前台中webService的地址与端口要根据vs2008运行时的那个地址定,并且在运行fb3中的mxml时,vs2008的这个网站要处于运行状态,webService才可以用

 回复 引用   
#24楼[楼主] 2011-07-10 16:11 | Bēniaǒ      
@yaesut
Book类忘记了贴进来,上面的评论中已经说明了的。
文章中new Book,给出了属性赋值代码,如果非初学者应该不会笨得看不出问题。

 回复 引用 查看   
#25楼[楼主] 2011-07-10 16:12 | Bēniaǒ      
@yaesut
引用yaesut:
以下是demo.mxml代码:
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:WebService id="dataService" wsdl="http://localhost:3035/WebService1.asmx?wsdl"
useProxy="false">
<mx:operation name="HelloWorld" result="onSucces...



VS运行才能调用WebService,你知道原理是什么嘛?只有运行起才标识WebService为运行环境的部署状态,才能提供服务。开个VS的虚拟机运行状态就等同于部署在IIS中。

 回复 引用 查看   
#26楼 2011-08-16 17:08 | 赵亚山      
很实用,对我这种新手太有用了,谢谢楼主,转走了
 回复 引用 查看   
#27楼[楼主] 2011-08-30 09:14 | Bēniaǒ      
@赵亚山
引用赵亚山:很实用,对我这种新手太有用了,谢谢楼主,转走了

:)欢迎转载。

 回复 引用 查看   
发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 1373929 9hZncn5Y9LI=
微软最有价值专家(MVP)

微软技术社区精英(CNTAC)

2010年IT博客大赛50强

微软最有影响力开发者(GDI)


Bing Maps开发一群:75662563
微软技术群-重庆站:97035589
RIA技术联盟QQ群:26917590
昵称:Bēniaǒ
园龄:4年6个月
荣誉:推荐博客
粉丝:408
关注:26

随笔分类(285)

文章分类(14)

积分与排名

  • 积分 - 760874
  • 排名 - 60

最新评论