Flex调用不同参数类型的.Net WebMethod
Flex在调用WebService方面封装的非常好,在调用.Net WebMethod过程中参数对象或返回对象都可以和Flex本地对象容合,并不需要作特定的转换(不过.Net有些对象还是不能被Flex所识别,如果DataSet)。以下是描述Flex调用具备不同参数类型或返回值类型的.Net WebMethod,从而让不了解Flex朋友认识到Flex在调用WebService的方便灵活性。大家都知道.Net WebMethod提供参数或返回值的类型是非常多样的,可以是值类型(最简单的类型)、普通实体模型(只有值类型属性)或比较复杂的对象模型(内嵌其他对象)。Flex有调用这些WebMethod的方式都是一样,只是在构造参数有些差别。
以下具体描述Flex调用不同.Net WebMethod的过程。
相关WebMethod方法
[WebMethod]
public User LoadUser(int i)
{
User item= new User();
item.Name = i.ToString();
return item;
}
[WebMethod]
public void AddUser(User[] items)
{
int count = items.Length;
}
[WebMethod]
[System.Xml.Serialization.XmlInclude(typeof(User))]
public Company LoadCompany(int i)
{
Company item = new Company();
item.Name = i.ToString();
item.Items = new User[]{new User(),new User()};
return item;
}
[WebMethod]
public void AddCompany(Company[] items)
{
int count = items.Length;
}
WebMethod用到的数据模型定义:
[Serializable]
public class User
{
public string Name;
public string Remark;
}
[Serializable]
public class Company
{
public string Name;
public User[] Items;
}
在Flex实现调用过程
在Flex制定相应的WebService调用对象,可以通过AS(Action Script)或MXML来描述,因为通过AS可以集中描述所以我比较喜欢采用这种方式。
相关WebService调用对象描述:
public class Test extends BaseLogic
{
override protected function get wsdlString():String
{
return "http://localhost/WebService3/Service1.asmx?WSDL";
}
override protected function OnCreateMethod():void
{
var mAdd:Operation = new Operation(this,"LoadUser");
mAdd.resultFormat = "object";
mAdd.request = {i:{}};
mAdd = new Operation(this,"AddUser");
mAdd.resultFormat = "object";
mAdd.request = {items:{}};
mAdd = new Operation(this,"LoadCompany");
mAdd.resultFormat = "object";
mAdd.request = {i:{}};
mAdd = new Operation(this,"AddCompany");
mAdd.resultFormat = "object";
mAdd.request = {items:{}};
}
public function LoadUserResult(call:Function):void{
getOperation("LoadUser").addEventListener("result",call)
}
public function AddUserResult(call:Function):void{
getOperation("AddUser ").addEventListener("result",call)
}
public function LoadCompanyResult(call:Function):void{
getOperation("LoadCompany ").addEventListener("result",call)
}
public function AddCompanyResult(call:Function):void{
getOperation("AddCompany ").addEventListener("result",call)
}
}
创建Test实例
public var test:WebService = new Test();
还要在相应控件容器的initialize事件中调用以下方法:
test.initialized(this,"test");
调用LoadUser方法
test.LoadUser(1);
可以通过以下方式访问返值成员。
test.LoadUser.lastResult.Name来获取返回的用户名。
调用AddUser方法
var items:Array = new Array();
items.push({Name:"a",Remark:"a"});
items.push({Name:"b",Remark:"b"});
test.AddUser(items);
调用LoadCompany方法
items.LoadCompany(2);
调用AddCompany方法
var users:Array = new Array();
users.push({Name:"a",Remark:"a"});
users.push({Name:"b",Remark:"b"});
var items:Array = new Array();
items.push({Name:"gentle",Items:users});
test.AddCompany(items);
Flex在调用WebService上的确很方便,但有些.Net的对象类型Flex并不能很好的支持,除了DataSet外还有ArrayList,由于Flex序列化时没有为item明确类型,因此.Net WebMethod接收数据类型是ArrayList时就不能有效的进行内部对象转换。由于我也是刚接触Flex没多久因此可能还存在比较多的问题没有发现,对Flex有兴趣的朋友可以一起探讨和学习。