Flex与.Net的WebService通信

来源:互联网 发布:淘宝购买战网点 编辑:程序博客网 时间:2024/05/22 05:21
 紧接上一篇文章,要用flex和.Net服务器通行,除了HttpService,还有另一种方法就是WebService

WebService的方法是基于SOAP协议的。说得简单一点就是让数据自动按照SOAP的协议转成XML传输。

类似HttpService,我们可以在flex声明一个WebService
<mx:WebService id="webService"//注意id,下面要用到
wsdl="http://localhost/WebService/RosterWebService.asmx?wsdl">//WebService页面的地址
<mx:operation name="GetRoster" result="webServiceResultHandler(event)">//**重点
<mx:request>
<numberOfStudents>//请求的内容,和界面控件studentStepper的值绑定起来
{studentStepper.value}
</numberOfStudents>
</mx:request>
</mx:operation>
</mx:WebService>
和HttpService有点不同。WebService需要一个mx:operation标签定义如何访问。首先name属性定义了对方服务器上用什么函数处理,你可以在C#部分的代码找到GetRoster()。由于GetRoster函数需要一个int参数,所以下面的请求内容也必须是一个int。最后result属性定义了返回结果后用webServiceResultHandler()处理。
我们看看webServiceResultHandler的代码:
private function webServiceResultHandler(event:ResultEvent):void
{
var result:ClassData = new ClassData();
result.ClassName = event.result.ClassName;
result.TeacherName = event.result.TeacherName;
result.TeacherID = event.result.TeacherID; var students:* =
event.result.Students;
result.Students = students
as ArrayCollection;
if (result.Students == null)
{
result.Students = new ArrayCollection([students]);
}
updateUI(result);
}
基本上和HttpService是一样的。
最后就是要一个发送函数和“发送”按钮的click事件绑定,这样当你按下发送按钮才可以发送:
private function callWebServiceClassData():void
{
webService.GetRoster.send();//注意到这个webService其实就是上面定义的那个,看id即可知
}

最后是C#的部分,页面名字叫RosterWebService.asmx,但实际这个文件没有代码,真正的代码在其后台文件RosterWebService.asmx.cs上
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Web.Services;
using FlexToNet.Data;

namespace FlexToNet.WebService
{
/// <summary>
/// Summary description for RosterWebService
/// </summary>
[WebService(Namespace = "http://www.blinemedical.com")]//注意namespace和flex上要一致
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
[ToolboxItem(false)]
public class RosterWebService : System.Web.Services.WebService//继承WebService
{

[WebMethod]//标记为WebMethod才能够通信
public ClassData GetRoster(int numberOfStudents)
{
ClassData sampleClass = new ClassData();
sampleClass.ClassName = "Science";
sampleClass.TeacherName = "Smith";
sampleClass.TeacherID = 10;
sampleClass.Students = new List<StudentData>();

for (int i = 0; i < numberOfStudents; i++)
{
StudentData studentOne = new StudentData();
studentOne.StudentID = i + 1;

if (i % 2 == 0)
studentOne.StudentName = "Denis";
else
studentOne.StudentName = "Alexey";

sampleClass.Students.Add(studentOne);
}

return sampleClass;
}
}
}

可以看到GetRoster函数并没有任何处理网络问题的代码,仅仅是接受一个参数,然后处理之后返回一个ClassData。
关键就在于[WebMethod]标记,代替了GetRoster处理了这些事情。这是C#反射功能的一个应用的典型。
另外例子中还有一个GetDataTable的函数,和上面的GetRoster原理一样,不在赘述
原创粉丝点击