本篇随笔主要是关于Flex与asp.net的WebService通讯,其中利用了SoapHeader。(如果你对SoapHeader不了解主看我以前的一篇随笔WebService开发(一) 如何使用Soap头)。由此可见WebService在跨平台方面的优势。
ASP.NET的WebService代码
using
System;
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
[WebService(Namespace = " http://davidfan.cnblogs.com " )] // 名称空间应该和Flex中定义相同
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{
public ValidateSoapHeader header;
[WebMethod]
[SoapHeader("header")]
public string HelloWorld()
{
if (header == null)
{
return "请提供验证信息.";
}
else
{
if (header.Name == "admin" && header.Password == "admin")
{
if (header.ExDate < DateTime.Now)
{
return "帐号过期";
}
else
{
return "验证成功";
}
}
else
{
return "用户名或密码错误";
}
}
}
}
/**/ /// <summary>
/// 继承自SoapHeader的自定义类
/// </summary>
public class ValidateSoapHeader : System.Web.Services.Protocols.SoapHeader
{
public ValidateSoapHeader()
{
}
public ValidateSoapHeader(string name, string password, DateTime dt)
{
this.name = name;
this.password = password;
this.exDate = dt;
}
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
private string password;
public string Password
{
get { return password; }
set { password = value; }
}
private DateTime exDate;
public DateTime ExDate
{
get { return exDate; }
set { exDate = value; }
}
}
using System.Web;
using System.Web.Services;
using System.Web.Services.Protocols;
[WebService(Namespace = " http://davidfan.cnblogs.com " )] // 名称空间应该和Flex中定义相同
[WebServiceBinding(ConformsTo = WsiProfiles.BasicProfile1_1)]
public class Service : System.Web.Services.WebService
{
public ValidateSoapHeader header;
[WebMethod]
[SoapHeader("header")]
public string HelloWorld()
{
if (header == null)
{
return "请提供验证信息.";
}
else
{
if (header.Name == "admin" && header.Password == "admin")
{
if (header.ExDate < DateTime.Now)
{
return "帐号过期";
}
else
{
return "验证成功";
}
}
else
{
return "用户名或密码错误";
}
}
}
}
/**/ /// <summary>
/// 继承自SoapHeader的自定义类
/// </summary>
public class ValidateSoapHeader : System.Web.Services.Protocols.SoapHeader
{
public ValidateSoapHeader()
{
}
public ValidateSoapHeader(string name, string password, DateTime dt)
{
this.name = name;
this.password = password;
this.exDate = dt;
}
private string name;
public string Name
{
get { return name; }
set { name = value; }
}
private string password;
public string Password
{
get { return password; }
set { password = value; }
}
private DateTime exDate;
public DateTime ExDate
{
get { return exDate; }
set { exDate = value; }
}
}
Flex的mxml、as代码
mxml
<?
xml version="1.0" encoding="utf-8"
?>
< mx:Application xmlns:mx ="http://www.adobe.com/2006/mxml" layout ="absolute" fontFamily ="simsun" fontSize ="12" >
< mx:Script >
<! [CDATA[
import WebServiceUtility.Info;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.rpc.soap.SOAPHeader;
private function SendRequest():void
{
var content:Info = new Info();
content.Name = UserName.text;
content.Password = PassWord.text;
content.ExDate = new Date(2010, 3, 10);
//关键在QName的构造函数
//第一个参数要和.Net的WebService的名称空间相同
//第二个参数要和.Net的WebService的继承自SoapHeader的自定义类名称相同
var qname:QName = new QName("http://davidfan.cnblogs.com","ValidateSoapHeader");
var header:SOAPHeader = new SOAPHeader(qname,content);
ws.clearHeaders();
ws.addHeader(header);
ws.HelloWorld();
}
private function OnResult(event:ResultEvent):void{
Result.text= event.result.toString();
}
private function OnFault(event:FaultEvent):void{
Result.text= event.message.toString();
}
]] >
</ mx:Script >
< mx:WebService id ="ws" wsdl ="http://localhost:9200/WebSite2/Service.asmx?WSDL"
result ="OnResult(event)" fault ="OnFault(event)" />
< mx:TextInput id ="UserName" x ="98" y ="94" />
< mx:TextInput id ="PassWord" x ="98" y ="124" />
< mx:Label x ="29" y ="98" text ="用户名:" />
< mx:Label x ="29" y ="128" text ="密 码:" />
< mx:Button x ="98" y ="184" label ="调用" click ="SendRequest()" />
< mx:Label x ="29" y ="156" text ="结 果:" />
< mx:TextInput id ="Result" x ="98" y ="154" />
</ mx:Application >
as
< mx:Application xmlns:mx ="http://www.adobe.com/2006/mxml" layout ="absolute" fontFamily ="simsun" fontSize ="12" >
< mx:Script >
<! [CDATA[
import WebServiceUtility.Info;
import mx.rpc.events.FaultEvent;
import mx.rpc.events.ResultEvent;
import mx.rpc.soap.SOAPHeader;
private function SendRequest():void
{
var content:Info = new Info();
content.Name = UserName.text;
content.Password = PassWord.text;
content.ExDate = new Date(2010, 3, 10);
//关键在QName的构造函数
//第一个参数要和.Net的WebService的名称空间相同
//第二个参数要和.Net的WebService的继承自SoapHeader的自定义类名称相同
var qname:QName = new QName("http://davidfan.cnblogs.com","ValidateSoapHeader");
var header:SOAPHeader = new SOAPHeader(qname,content);
ws.clearHeaders();
ws.addHeader(header);
ws.HelloWorld();
}
private function OnResult(event:ResultEvent):void{
Result.text= event.result.toString();
}
private function OnFault(event:FaultEvent):void{
Result.text= event.message.toString();
}
]] >
</ mx:Script >
< mx:WebService id ="ws" wsdl ="http://localhost:9200/WebSite2/Service.asmx?WSDL"
result ="OnResult(event)" fault ="OnFault(event)" />
< mx:TextInput id ="UserName" x ="98" y ="94" />
< mx:TextInput id ="PassWord" x ="98" y ="124" />
< mx:Label x ="29" y ="98" text ="用户名:" />
< mx:Label x ="29" y ="128" text ="密 码:" />
< mx:Button x ="98" y ="184" label ="调用" click ="SendRequest()" />
< mx:Label x ="29" y ="156" text ="结 果:" />
< mx:TextInput id ="Result" x ="98" y ="154" />
</ mx:Application >
package
WebServiceUtility
{
public class Info{
//该类名称可以和.Net中的ValidateSoapHeader不同
//但字段要对应拼写相同
public var Name:String;
public var Password:String;
public var ExDate:Date;
}
}
{
public class Info{
//该类名称可以和.Net中的ValidateSoapHeader不同
//但字段要对应拼写相同
public var Name:String;
public var Password:String;
public var ExDate:Date;
}
}