摘自:《.NET for Flash動(dòng)態(tài)網(wǎng)站開發(fā)手札》 作者:張亞飛 電子工業(yè)出版社
17.1 應(yīng)用Flash Remoting MX構(gòu)建的Flash影片
應(yīng)用程序架構(gòu)
應(yīng)用Flash Remoting MX構(gòu)建Flash影片應(yīng)用程序和其他“客戶端/服務(wù)器”應(yīng)用程序極為相似(包括基于瀏覽器的網(wǎng)絡(luò)應(yīng)用程序,所以我們不時(shí)使用“客戶端/服務(wù)器”這樣的術(shù)語(yǔ))。例如,F(xiàn)lash影片應(yīng)用程序一般位于一個(gè)瀏覽器窗口中,嵌入在一個(gè)HTML頁(yè)內(nèi),實(shí)際上也是作為HTML頁(yè)內(nèi)的一個(gè)動(dòng)態(tài)元素。
另外,F(xiàn)lash影片應(yīng)用程序中“控件(組件)”可以用來顯示文本和圖形,用戶還可以鍵入文字信息并和遠(yuǎn)程服務(wù)器進(jìn)行通信,從這一點(diǎn)上來說非常像HTML頁(yè)。
Flash影片應(yīng)用程序也可以創(chuàng)建服務(wù)端方法,請(qǐng)求調(diào)用遠(yuǎn)程服務(wù),服務(wù)端方法調(diào)用由客戶端發(fā)起,一般是一個(gè)異步事件:Flash影片應(yīng)用程序請(qǐng)求調(diào)用遠(yuǎn)程服務(wù),遠(yuǎn)程服務(wù)端處理請(qǐng)求,返回結(jié)果;作為宿主的Flash Player不會(huì)等待這一結(jié)果返回,但是當(dāng)結(jié)果返回時(shí)會(huì)處理該結(jié)果。
17.1.1 理解Flash Remoting MX開發(fā)環(huán)境架構(gòu)
因?yàn)镕lash Remoting MX連接兩個(gè)截然不同、相互獨(dú)立的運(yùn)行時(shí)環(huán)境,所以在使用Flash Remoting MX構(gòu)建Flash影片應(yīng)用程序時(shí)就必須使用兩種開發(fā)語(yǔ)言:ActionScript和應(yīng)用服務(wù)器使用的開發(fā)語(yǔ)言。因此,使用Flash Remoting MX構(gòu)建Flash影片應(yīng)用程序至少要求有兩個(gè)不同開發(fā)環(huán)境的知識(shí)。
Flash可以用來創(chuàng)建使用Flash Remoting MX的Flash影片應(yīng)用程序:
l 可以使用Flash來設(shè)計(jì)用戶界面
l 可以使用Flash編寫客戶端ActionScript腳本代碼
應(yīng)用服務(wù)器有很多種,使用的開發(fā)語(yǔ)言也很多:ColdFusion使用ColdFusion開發(fā)語(yǔ)言;Java就是使用Java語(yǔ)言;.NET則支持的語(yǔ)言很多,包括VB、C#等。開發(fā)工具也多種多樣,你可以使用文本編輯器也可以選擇集成開發(fā)環(huán)境(IDE)。集成開發(fā)環(huán)境一般支持相關(guān)的程序語(yǔ)言及其API。Dreamweaver是一個(gè)不錯(cuò)的IDE,它支持ColdFusion、JSP和ASP.NET。本書主要是使用VB.NET開發(fā)的ASP.NET作為應(yīng)用服務(wù)器技術(shù)。
因?yàn)榭蛻舳撕头?wù)端環(huán)境相互獨(dú)立,所以在使用Flash Remoting MX構(gòu)建Flash影片應(yīng)用程序時(shí),可以把它作為一個(gè)工程組。一般而言,一個(gè)網(wǎng)絡(luò)應(yīng)用程序需要設(shè)計(jì)人員和開發(fā)人員協(xié)同工作。設(shè)計(jì)人員創(chuàng)建用戶界面,開發(fā)人員編寫客戶端ActionScript腳本代碼和應(yīng)用服務(wù)器邏輯。
在使用Flash Remoting MX構(gòu)建Flash影片應(yīng)用程序時(shí),把服務(wù)端開發(fā)、客戶端開發(fā)和客戶端設(shè)計(jì)明確地組織起來,定義好各自的角色是非常重要的。從工作分工而言,客戶端設(shè)計(jì)人員創(chuàng)建Flash影片應(yīng)用程序用戶界面,工作包括頁(yè)面布局、動(dòng)畫、效果等;客戶端開發(fā)人員編寫ActionScript腳本代碼連接到遠(yuǎn)程服務(wù),并處理結(jié)果;最后,服務(wù)端開發(fā)人員在應(yīng)用服務(wù)器上創(chuàng)建業(yè)務(wù)邏輯作為遠(yuǎn)程服務(wù)。
這是應(yīng)用Flash Remoting MX技術(shù)開發(fā)Flash影片應(yīng)用程序工程的架構(gòu)設(shè)計(jì)模式,下面我們就來了解一下Flash Remoting MX的設(shè)計(jì)模式。
17.1.2 使用Flash Remoting MX設(shè)計(jì)模式
Flash Remoting MX技術(shù)被設(shè)計(jì)成可以和選定的(現(xiàn)有的)設(shè)計(jì)模式及框架集成在一起,這正是它的特點(diǎn),用戶也可以由此降低成本。對(duì)于Flash影片應(yīng)用程序和.NET這兩個(gè)現(xiàn)有的運(yùn)行框架而言,F(xiàn)lash Remoting MX在中間執(zhí)行的是一個(gè)非常有效率的結(jié)構(gòu)化設(shè)計(jì)模式。除了可以提高開發(fā)效率、減少由于設(shè)計(jì)方面的欠缺導(dǎo)致的誤解外,該模式可以用來強(qiáng)制檢查“客戶端/服務(wù)器”之間的交互,提高應(yīng)用程序的性能和穩(wěn)定性。
1.Model-View-Controller設(shè)計(jì)模式
現(xiàn)今,用戶界面向?qū)偷膽?yīng)用程序風(fēng)靡世界,程序軟件開發(fā)一般使用Model-View- Controller(MVC)方式,這種方式根據(jù)用途組織應(yīng)用程序代碼。在使用Flash Remoting MX構(gòu)建Flash影片應(yīng)用程序時(shí),就是使用的這種方式。
MVC程序軟件開發(fā)方式包含下面的幾個(gè)元素:
(1)Model。Model(模型)代表應(yīng)用程序數(shù)據(jù)和數(shù)據(jù)的處理,以及其他的邏輯。在一個(gè)網(wǎng)絡(luò)應(yīng)用程序中,就是應(yīng)用服務(wù)器程序和數(shù)據(jù)庫(kù)。
(2)View。View(查看)代表用戶界面,一般包含用戶控制和信息顯示(動(dòng)態(tài)的和靜態(tài)的)兩個(gè)元素。
(3)Controller。Controller(控制)代表著處理用戶輸入,根據(jù)輸入改變模型然后查看的邏輯。根據(jù)應(yīng)用程序設(shè)計(jì)的不同,Controller 可以位于客戶端也可以位于服務(wù)端,或者兩者結(jié)合起來。為了將網(wǎng)絡(luò)信息交換減少到最小,充分利用Flash Player運(yùn)行時(shí),一般應(yīng)當(dāng)在Flash影片應(yīng)用程序中完成Controller。
如圖17-1所示揭示了Flash Remoting MX環(huán)境應(yīng)用中的MVC架構(gòu)。

圖17-1 Flash Remoting MX環(huán)境應(yīng)用中的MVC架構(gòu)
在圖17-1中,F(xiàn)lash Remoting MX使得controller和model相互分離,它實(shí)際是在Flash影片應(yīng)用程序和應(yīng)用服務(wù)器(或者Web Service)之間起到一個(gè)通信通道的作用。
2.其他的Flash Remoting MX設(shè)計(jì)模式
除前面介紹的模式外,也有其他的設(shè)計(jì)模式,主要是為了減少遠(yuǎn)程服務(wù)方法調(diào)用,例如value object模式。Flash Remoting MX能從一個(gè)遠(yuǎn)程服務(wù)返回結(jié)果,并將結(jié)果作為一個(gè)ActionScript對(duì)象。ActionScript對(duì)象可以用來打包遠(yuǎn)程服務(wù)數(shù)據(jù),僅返回一個(gè)對(duì)象給Flash影片應(yīng)用程序,這樣就避免了無數(shù)的、頻繁的單個(gè)調(diào)用。
為了簡(jiǎn)化遠(yuǎn)程服務(wù)API以適用于Flash影片應(yīng)用程序,你可以使用facade設(shè)計(jì)模式,這種模式在Flash影片應(yīng)用程序和遠(yuǎn)程服務(wù)之間提供一個(gè)緩沖層。facade設(shè)計(jì)模式規(guī)定了一個(gè)服務(wù)端應(yīng)用程序經(jīng)紀(jì)人,用來接收Flash影片應(yīng)用程序遠(yuǎn)程調(diào)用,并傳遞方法到相應(yīng)的服務(wù)器資源。這就給了你更多的適應(yīng)性:你可以改變遠(yuǎn)程服務(wù)架構(gòu),而不需改變Flash影片應(yīng)用程序。
如圖17-2所示揭示了Flash Remoting MX環(huán)境應(yīng)用中的facade設(shè)計(jì)模式。

圖17-2 Flash Remoting MX環(huán)境應(yīng)用中的facade設(shè)計(jì)模式
ColdFusion組件、JavaBeans,以及.NET 程序集都可以用做facade。它們都可以接收所有來自Flash影片應(yīng)用程序的功能請(qǐng)求,并將這些請(qǐng)求分配給相應(yīng)的應(yīng)用服務(wù)器資源或者根據(jù)請(qǐng)求進(jìn)行網(wǎng)絡(luò)服務(wù)調(diào)用,在本書前面的章節(jié)已經(jīng)為您詳細(xì)地介紹過怎樣使用Flash Remoting MX從Flash影片應(yīng)用程序調(diào)用.NET程序集了。
17.1.3 理解Flash Remoting MX for .NET 目錄結(jié)構(gòu)
要為應(yīng)用Flash Remoting MX技術(shù)而使用一個(gè)ASP.NET應(yīng)用程序,必須將Flash Remoting MX程序集(FlashGateway.dll)放置在應(yīng)用程序的本地程序集緩存中(bin目錄下),并在應(yīng)用程序的 web.config文件中注冊(cè)該程序集。在最簡(jiǎn)單的ASP.NET表單應(yīng)用程序中,ASP.NET應(yīng)用程序的目錄結(jié)構(gòu)如圖17-3所示。

圖17-3 ASP.NET應(yīng)用程序的目錄結(jié)構(gòu)
如圖17-3所示,在我們前面介紹的helloWorld例子中,3JK目錄中的本地程序集緩存包含有Flash Remoting MX程序集(flashgateway.dll)。要使Flash影片應(yīng)用程序連接到一個(gè)遠(yuǎn)程服務(wù),必須引用Web根目錄下應(yīng)用程序目錄中的物理資源。
Flash Remoting MX自動(dòng)安裝了一個(gè)名為gateway.aspx的空ASPX文件,但是你也可以使用應(yīng)用程序目錄中的任何ASPX文件,在這里我們使用了默認(rèn)的gateway.aspx。
web.config文件包含有flashgateway.dll程序集的注冊(cè)信息。HttpModule配置模塊可以處理對(duì)ASP.NET資源的所有Web請(qǐng)求。所以我們要在web.config文件中添加下面的一段配置語(yǔ)句:
<httpModules>
<add name="GatewayController" type=
"FlashGateway.Controller.GatewayController,flashgateway" />
</httpModules>
如果對(duì)服務(wù)端方法的請(qǐng)求中包含著AMF信息,F(xiàn)lash Remoting MX就會(huì)解釋AMF信息并使請(qǐng)求繼續(xù)下去。
技巧與提示
注意,在安裝Flash Remoting MX for .NET時(shí),會(huì)在Web根目錄下創(chuàng)建一個(gè)名為flashremoting的目錄。在該目錄下,你可以發(fā)現(xiàn)一個(gè)本地程序集緩存(bin目錄),以及一個(gè)Samples目錄,該目錄下存放了Flash影片應(yīng)用程序的例子。
17.2 深入Flash Remoting MX網(wǎng)關(guān)和服務(wù)適配器
Flash Remoting MX將進(jìn)入的請(qǐng)求映射到對(duì)應(yīng)的服務(wù)適配器,這就可以直接連接到一個(gè)特定的應(yīng)用服務(wù)器。
當(dāng)一個(gè)HTTP請(qǐng)求到達(dá)服務(wù)器時(shí),它包含了AMF信息,F(xiàn)lash Remoting MX根據(jù)名稱將該請(qǐng)求映射到對(duì)應(yīng)的服務(wù)適配器。要避免名稱沖突,可以在ActionScript腳本代碼中定義目錄結(jié)構(gòu)、充分授權(quán)的類名或包名,或者是描述Web服務(wù)的WSDL URL地址。
17.2.1 應(yīng)用Flash Remoting MX for .NET
Flash Remoting MX將ASP.NET技術(shù)作為Flash影片應(yīng)用程序的一個(gè)遠(yuǎn)程服務(wù),因而可以被當(dāng)作ActionScript的一項(xiàng)功能,這樣就能被Flash影片應(yīng)用程序識(shí)別。
能夠作為遠(yuǎn)程服務(wù)的Microsoft.NET技術(shù)有很多,包括ASP.NET網(wǎng)頁(yè)、Web服務(wù)、程序集方法。Flash開發(fā)人員編寫ActionScript腳本代碼可以使用一個(gè)稱為NetServices或Service的功能類庫(kù)連接到一個(gè)遠(yuǎn)程.NET服務(wù)器,或者引用一個(gè)遠(yuǎn)程服務(wù),調(diào)用遠(yuǎn)程服務(wù)的功能。
為了通過HTTP傳輸信息, Flash Remoting MX使用一個(gè)稱為Action Message Format (AMF)的二進(jìn)制信息格式,它模擬了Web服務(wù)執(zhí)行時(shí)使用的Simple Object Access Protocol (SOAP)協(xié)議。它允許使用HTTP在Internet上發(fā)送各種數(shù)據(jù)類型,包括記錄集和其他的原始數(shù)據(jù)類型(如整數(shù)、字符串、XML文檔和日期等)。
Flash Remoting MX網(wǎng)關(guān)是ASP.NET運(yùn)行時(shí)的一個(gè)前端控件,它處理從ActionScript到.NET Common Language Runtime (CLR)的數(shù)據(jù)類型轉(zhuǎn)換。在網(wǎng)關(guān)收到服務(wù)請(qǐng)求之前,該請(qǐng)求必須先通過過濾裝置處理串行數(shù)據(jù)、日志和安全檢驗(yàn),最后到達(dá)一個(gè)服務(wù)適配器,服務(wù)適配器被用來處理服務(wù)和啟動(dòng)類型。
對(duì)于Microsoft.NET技術(shù),F(xiàn)lash Remoting MX包含四個(gè)服務(wù)適配器:
l ASP.NET適配器
l ADO.NET數(shù)據(jù)綁定適配器
l Web服務(wù)適配器
l 程序集適配器(*.dll)
Flash Remoting MX for .NET要求安裝.NET Framework SDK,要檢查是否安裝了.NET Framework SDK,可打開Windows控制面板,雙擊“添加/刪除應(yīng)用程序”選項(xiàng),查看有沒有Microsoft.NET Framework SDK。如果沒有看到,就要下載一個(gè)安裝上。(下載地址http://msdn.microsoft.com/downloads/default.asp?url=/downloads/sample.asp?url=/msdn-files/027/000/976/msdncompositedoc.xml)
Flash Remoting MX怎樣融入Microsoft.NET框架
當(dāng)Flash影片應(yīng)用程序和Flash Remoting MX服務(wù)器控件被嵌入在ASPX網(wǎng)頁(yè)中時(shí),使用Flash Remoting MX的Flash影片應(yīng)用程序就成為 .NET應(yīng)用程序中客戶端內(nèi)容中的一部分。Flash Remoting MX在 ASP.NET網(wǎng)頁(yè)和.NET網(wǎng)絡(luò)表單應(yīng)用程序中可以用做一個(gè)自定義服務(wù)器控件,或者也可以在一個(gè).NET 程序集(DLL)文件中用做一個(gè)命名空間,還可以用在一個(gè)代碼隱藏類文件和Web服務(wù)中。一個(gè) .NET 程序集(flashgateway.dll)位于ASP.NET應(yīng)用程序本地程序集緩存中,它提供了Flash Remoting MX的功能。
17.2.2 關(guān)于AMF
如果您對(duì)生物學(xué)非常熟悉的話,有可能知道AMF,它是一種極其罕見的植物名,名為叢枝內(nèi)生菌根菌,是菌根菌的一種。絕大部分植物都能從陽(yáng)光中獲取賴以生存的食物,但是菌根菌靠吸取寄生植物的勞動(dòng)果實(shí)成活。
在Flash Remoting MX中,AMF正是這樣一種事物,只不過它是一種信息編碼格式。它本身并不產(chǎn)生信息數(shù)據(jù),而是對(duì)通過HTTP在Flash影片應(yīng)用程序和遠(yuǎn)程服務(wù)之間傳遞的數(shù)據(jù)進(jìn)行編碼和解碼來產(chǎn)生信息數(shù)據(jù)。
由于AMF是專為ActionScript對(duì)象模型設(shè)計(jì)的信息編碼格式,所以對(duì)于使用Flash Remoting MX的Flash影片應(yīng)用程序來說非常高效。
AMF的全稱是Action Message Format,它采用二進(jìn)制格式,專為ActionScript對(duì)象模型設(shè)計(jì),要從遠(yuǎn)程服務(wù)發(fā)送和接收信息,F(xiàn)lash Remoting MX就使用Action Message Format。使用AMF,F(xiàn)lash Remoting MX可以編碼和解碼通過HTTP在Flash影片應(yīng)用程序和遠(yuǎn)程服務(wù)之間傳遞的數(shù)據(jù)。
AMF符合Simple Object Access Protocol(SOAP)協(xié)議格式,它使用信息包格式分段傳送信息。一個(gè)AMF信息包包含下面5個(gè)部分:
l 信息包頭,這一部分包含了AMF版本信息
l 上下關(guān)系頭計(jì)數(shù)
l 上下關(guān)系頭配置。上下關(guān)系頭包含了一個(gè)一個(gè)獨(dú)立的AMF信息應(yīng)當(dāng)怎樣被處理的描述信息
l 信息計(jì)數(shù)
l 信息配置
在客戶端,服務(wù)端的方法請(qǐng)求被使用NetServices類或Service類的方法自動(dòng)序列化為AMF格式;在服務(wù)端,F(xiàn)lash Remoting MX逆序列化AMF信息。當(dāng)服務(wù)端處理完成時(shí),結(jié)果又被序列化為AMF格式,并發(fā)回Flash影片應(yīng)用程序。服務(wù)端創(chuàng)建的AMF信息格式與客戶端創(chuàng)建的AMF信息格式相同。單獨(dú)的AMF信息包主體內(nèi),包含了錯(cuò)誤或響應(yīng)對(duì)象,它們被表述成一個(gè)ActionScript對(duì)象。
17.2.3 Flash Remoting MX和數(shù)據(jù)類型
當(dāng)應(yīng)用Flash Remoting MX技術(shù),從Flash影片應(yīng)用程序向應(yīng)用服務(wù)器發(fā)送數(shù)據(jù)和應(yīng)用服務(wù)器返回?cái)?shù)據(jù)給Flash影片應(yīng)用程序時(shí),數(shù)據(jù)被進(jìn)行了兩次轉(zhuǎn)換:
(1)在客戶端的Flash影片應(yīng)用程序中,在ActionScript數(shù)據(jù)類型和Action Message Format(AMF)兩種數(shù)據(jù)類型之間轉(zhuǎn)換:發(fā)送時(shí)從ActionScript數(shù)據(jù)類型轉(zhuǎn)換成AMF格式;返回的數(shù)據(jù)從AMF數(shù)據(jù)格式轉(zhuǎn)換成ActionScript數(shù)據(jù)類型;
(2)在服務(wù)器網(wǎng)關(guān)中,是在.NET語(yǔ)言(C#、Visual Basic)數(shù)據(jù)類型和Action Message Format(AMF)兩種數(shù)據(jù)類型之間轉(zhuǎn)換:向應(yīng)用服務(wù)器發(fā)送時(shí)從AMF數(shù)據(jù)格式轉(zhuǎn)換成.NET語(yǔ)言(C#、Visual Basic)數(shù)據(jù)類型;從應(yīng)用服務(wù)器返回的數(shù)據(jù)從.NET語(yǔ)言(C#、Visual Basic)數(shù)據(jù)類型轉(zhuǎn)換成AMF數(shù)據(jù)格式。
如圖17-4所示顯示了這兩次數(shù)據(jù)類型的轉(zhuǎn)換。

圖17-4 Flash Remoting MX的兩次數(shù)據(jù)類型轉(zhuǎn)換
這兩次數(shù)據(jù)類型轉(zhuǎn)換使得Flash Remoting MX可以不依賴服務(wù)器系統(tǒng)的數(shù)據(jù)編碼方法,從而可以非常有效地與各種應(yīng)用服務(wù)器技術(shù)相結(jié)合,包括Microsoft.NET應(yīng)用服務(wù)器技術(shù)。
Flash Remoting MX可以自動(dòng)識(shí)別數(shù)據(jù)類型并進(jìn)行相應(yīng)的數(shù)據(jù)類型轉(zhuǎn)換。大多數(shù)情況下,數(shù)據(jù)類型轉(zhuǎn)換是非常直接簡(jiǎn)單的,你只需將ActionScript數(shù)據(jù)作為參數(shù)傳遞給應(yīng)用服務(wù)器,然后在結(jié)果處理方法中處理返回的結(jié)果即可。但是也有少數(shù)的情況必須考慮數(shù)據(jù)類型轉(zhuǎn)換,否則,程序會(huì)出現(xiàn)不可預(yù)知的后果。
下面我們來詳細(xì)介紹一下.NET語(yǔ)言(Visual Basic)的數(shù)據(jù)類型和ActionScript數(shù)據(jù)類型之間轉(zhuǎn)換的對(duì)應(yīng)關(guān)系。
1.從ActionScript數(shù)據(jù)類型向.NET數(shù)據(jù)類型轉(zhuǎn)換
表17-1列出了ActionScript數(shù)據(jù)類型和相應(yīng)的應(yīng)用程序服務(wù)器中支持的數(shù)據(jù)類型。
表17-1 ActionScript數(shù)據(jù)類型和相應(yīng)的VB.NET數(shù)據(jù)類型
ActionScript數(shù)據(jù)類型
|
VB.NET數(shù)據(jù)類型
|
Number(簡(jiǎn)單數(shù)據(jù)類型)
|
任何數(shù)值數(shù)據(jù)類型,包括Decimal、Double(雙精度浮點(diǎn)型)、Integer和Long(長(zhǎng)整型)
|
boolean(簡(jiǎn)單數(shù)據(jù)類型)
|
Boolean
|
String(簡(jiǎn)單數(shù)據(jù)類型)
|
String
|
ActionScript(AS)對(duì)象
|
FlashGateway.IO.ASObject
|
Object(作為參數(shù)被傳遞到遠(yuǎn)程服務(wù)方法的對(duì)象,該對(duì)象是由name/value形式構(gòu)成的)
|
FlashGateway.IO.ASObject
|
null
|
Nothing
|
undefined
|
Nothing
|
Array(索引是連續(xù)的數(shù)值)
|
System.Collections.ArrayList
|
Associative Array(索引是名稱標(biāo)示)
|
System.Collections.Hashtable
|
Date
|
Date
|
XML
|
System.Xml.XmlDocument
|
RecordSet(不能發(fā)送)
|
無對(duì)應(yīng)項(xiàng)
|
在從ActionScript數(shù)據(jù)類型向VB.NET數(shù)據(jù)類型轉(zhuǎn)換時(shí)還要注意以下幾個(gè)重要的問題:
(1)只要是可能,F(xiàn)lash Remoting MX都會(huì)把ActionScript Number轉(zhuǎn)換成.NET數(shù)值數(shù)據(jù)類型。但是,如果數(shù)值不能轉(zhuǎn)換成相應(yīng)的應(yīng)用服務(wù)器數(shù)據(jù)類型(例如,ActionScript數(shù)值超出了應(yīng)用服務(wù)器數(shù)據(jù)類型一個(gè)整形數(shù)值類型的范圍),F(xiàn)lash Remoting MX就會(huì)在服務(wù)器上拋出一個(gè)錯(cuò)誤,因此在開發(fā)應(yīng)用程序時(shí)要注意應(yīng)用服務(wù)器數(shù)據(jù)類型的取值范圍。
如表17-2所示列出了VB.NET數(shù)值數(shù)據(jù)類型的取值范圍。
表17-2 VB.NET數(shù)值數(shù)據(jù)類型的取值范圍
Decimal
|
0 到 +/-79 228 162 514 264 337 593 543 950 335之間不帶小數(shù)點(diǎn)的數(shù);
0 到 +/-7.922 816 251 426 433 759 354 395 033 5 之間帶 28 位小數(shù)的數(shù);
最小非零數(shù)為+/-0.000 000 000 000 000 000 000 000 000 1 (+/-1E-28)。
|
Double
(雙精度浮點(diǎn)型)
|
負(fù)數(shù)取值范圍為-1.797 693 134 862 31E+308到 -4.940 656 458 412 47E-324;
正值取值范圍為 4.940 656 458 412 47E-324到 1.797 693 134 862 31E+308。
|
Integer
|
-2 147 483 648 到 2 147 483 647。
|
Long(長(zhǎng)整型)
|
-9 223 372 036 854 775 808 到 9 223 372 036 854 775 807。
|
(2)Flash Remoting MX在處理復(fù)合數(shù)組(Associative Array)時(shí)與對(duì)待連續(xù)數(shù)組不同。有一些ActionScript數(shù)組包含了不連續(xù)的索引(例如,僅包含索引0,2和3 ,而不包含索引1的數(shù)組),有一些ActionScript數(shù)組既包含數(shù)字又包含字符串,這些數(shù)組稱為復(fù)合數(shù)組。Flash Remoting MX在處理復(fù)合數(shù)組時(shí)會(huì)將索引值轉(zhuǎn)換成鍵值,但是當(dāng)數(shù)值作為鍵值時(shí)是字符串類型(例如,"0","1","2")。
2.從.NET數(shù)據(jù)類型向ActionScript數(shù)據(jù)類型轉(zhuǎn)換
如表17-3所示列出了應(yīng)用程序服務(wù)器數(shù)據(jù)類型和相應(yīng)的ActionScript中支持的數(shù)據(jù)類型:
表17-3 VB.NET數(shù)據(jù)類型和相應(yīng)的ActionScript數(shù)據(jù)類型
VB.NET數(shù)據(jù)類型
|
ActionScript數(shù)據(jù)類型
|
Nothing
|
null
|
Boolean
|
Boolean
|
任何數(shù)值數(shù)據(jù)類型,包括Decimal、Double、Integer和Long
|
Number
|
Char String
|
String
|
Date
|
Date
|
System.Collections.ICollection
|
|
object[]
|
Array
|
System.Collections.Hashtable
|
|
System.Collections.IDictionary
|
Associative array
|
Sytem.Data.DataSet
|
由RecordSet對(duì)象組成的復(fù)合數(shù)組
|
System.Data.DataTable
|
RecordSet
|
FlashGateway.IO.ASObject
|
|
System.Exception
|
Object
|
FlashGateway.IO.ASObject(定義了Type屬性)
|
Typed Object
|
System.Xml.XmlDocument
|
XML
|
(1)在從應(yīng)用程序服務(wù)器數(shù)據(jù)類型向ActionScript數(shù)據(jù)類型轉(zhuǎn)換時(shí)的注意事項(xiàng)
①如果應(yīng)用服務(wù)器上的字符串?dāng)?shù)據(jù)表示的是一個(gè)數(shù)字,那么,在ActionScript中,如果需要的話,F(xiàn)lash將會(huì)將該字符串自動(dòng)轉(zhuǎn)換成數(shù)字。
②如果使用setType方法為應(yīng)用服務(wù)器上的flashgateway.io.ASObject對(duì)象定義對(duì)象類型,并且對(duì)象類型名與ActionScript內(nèi)建的對(duì)象類名相同,F(xiàn)lash Remoting MX將會(huì)在ActionScript腳本中創(chuàng)建一個(gè)該類的實(shí)例。
③要返回大量且相互獨(dú)立的數(shù)據(jù)給Flash影片應(yīng)用程序,可以定義一個(gè)復(fù)雜的應(yīng)用服務(wù)器變量來包含這些數(shù)據(jù),例如,一個(gè)變量可以轉(zhuǎn)換成一個(gè)ActionScript對(duì)象,也可以是數(shù)組或者復(fù)合數(shù)組,僅僅返回一個(gè)變量,但是在Flash影片應(yīng)用程序中可以使用該變量中的多個(gè)元素。
(2)處理對(duì)象
當(dāng)在遠(yuǎn)程服務(wù)方法調(diào)用中傳遞一個(gè)Flash對(duì)象時(shí),對(duì)象的屬性被傳遞給網(wǎng)關(guān)。在.NET環(huán)境中,F(xiàn)lashGateway.IO.ASObject類(它執(zhí)行ICollection接口)的一個(gè)實(shí)例就相當(dāng)于一個(gè)Flash對(duì)象。因此,你可以向任何接受Map或ICollection的方法傳遞Flash對(duì)象。
因?yàn)镕lash Remoting MX僅僅是傳輸數(shù)據(jù),在服務(wù)器上對(duì)象方法是不適用的,同樣,對(duì)象的屬性也必須是Flash Remoting MX能夠處理的類型。例如,你不能在一個(gè)將傳遞給遠(yuǎn)程服務(wù)方法的對(duì)象中包含F(xiàn)lash RecordSet對(duì)象,因?yàn)镕lash Remoting MX不能將RecordSet對(duì)象轉(zhuǎn)換成服務(wù)器上的一種數(shù)據(jù)類型。
當(dāng)從服務(wù)器返回一個(gè)對(duì)象給Flash時(shí),F(xiàn)lash Remoting MX將對(duì)象數(shù)據(jù)屬性信息作為Flash對(duì)象發(fā)送給Flash。在Flash中,你可以將該對(duì)象的屬性轉(zhuǎn)換成Flash數(shù)據(jù)類型的。
(3)處理ActionScript typed對(duì)象
如果你在ActionScript腳本中使用Object.RegisterClass方法注冊(cè)一個(gè)對(duì)象的話,你就創(chuàng)建了一個(gè)typed對(duì)象。Typed對(duì)象在Flash影片應(yīng)用程序中是非常有用的,它可以用來創(chuàng)建Flash對(duì)象的子類。
在對(duì)Flash Remoting服務(wù)方法的調(diào)用中,你可以使用typed對(duì)象。
在一個(gè)服務(wù)方法調(diào)用中使用typed對(duì)象的一個(gè)實(shí)例,在服務(wù)器端,F(xiàn)lashgateway.IO. ASObject對(duì)象代表參數(shù),它包含了對(duì)象的type名。
例如,下面的ActionScript腳本創(chuàng)建了一個(gè)typed對(duì)象,并在一個(gè)服務(wù)方法中使用該對(duì)象:
//創(chuàng)建一個(gè)類(也就是類的構(gòu)造器)
myClass = function()
{
this.Value1 = "Test1";
}
//注冊(cè)類
Object.registerClass("testClass", myClass);
//將一個(gè)類的實(shí)例發(fā)送到遠(yuǎn)程應(yīng)用服務(wù)器Flash Remoting網(wǎng)關(guān)
myService.myFunction(new testClass());
應(yīng)用服務(wù)器上的服務(wù)方法接收到該請(qǐng)求,參數(shù)是一個(gè)type對(duì)象,在Java和ColdFusion中是flashgateway.io.ASObject,在 .NET環(huán)境中是FlashGateway.IO.ASObject。服務(wù)方法可以訪問該類的type名:testClass(在Java和ColdFusion中使用對(duì)象的getType方法,在.NET環(huán)境中使用ASType屬性)。
當(dāng)服務(wù)方法創(chuàng)建了一個(gè)新的typed對(duì)象返回Flash Remoting MX時(shí),在Java和ColdFusion中,它實(shí)際是創(chuàng)建了一個(gè)type flashgateway.io.ASObject對(duì)象;在.NET環(huán)境中,它實(shí)際是創(chuàng)建了一個(gè)type FlashGateway.IO.ASObject對(duì)象。服務(wù)方法使用對(duì)象的構(gòu)造器(在.NET環(huán)境中使用ASType屬性)為在ActionScript腳本中使用Object.registerClass方法指定的type設(shè)置類名。
當(dāng)Flash客戶端從服務(wù)方法中接收到typed對(duì)象時(shí),F(xiàn)lash運(yùn)行type的構(gòu)造器,并粘附該對(duì)象所有的prototype方法。
17.3 調(diào)用遠(yuǎn)程服務(wù)方法和處理遠(yuǎn)程服務(wù)調(diào)用結(jié)果
使用Flash Remoting MX調(diào)用一個(gè)應(yīng)用服務(wù)就像是在調(diào)用一個(gè)Web服務(wù),或者是在做一個(gè)遠(yuǎn)程過程調(diào)用(RPC)。因?yàn)椋?dāng)你對(duì)遠(yuǎn)程服務(wù)做一個(gè)調(diào)用時(shí),你會(huì)從該服務(wù)獲得一個(gè)回應(yīng)。當(dāng)使用Web服務(wù)和RPC時(shí),遠(yuǎn)程服務(wù)上的數(shù)據(jù)先從其自身數(shù)據(jù)類型被轉(zhuǎn)換成用于網(wǎng)絡(luò)傳輸?shù)臄?shù)據(jù),這種數(shù)據(jù)只是一種表示法。
與RPC或者Web服務(wù)請(qǐng)求不同,使用Flash Remoting MX進(jìn)行的調(diào)用不直接接收遠(yuǎn)程服務(wù)的結(jié)果,而是編寫一個(gè)結(jié)果處理程序來處理返回的數(shù)據(jù)。由于遠(yuǎn)程服務(wù)調(diào)用和結(jié)果處理程序是相互獨(dú)立的,所以遠(yuǎn)程服務(wù)調(diào)用和結(jié)果處理是異步進(jìn)行的。也就是說,遠(yuǎn)程服務(wù)請(qǐng)求就像是一個(gè)沒有返回結(jié)果的方法調(diào)用,而遠(yuǎn)程服務(wù)請(qǐng)求的結(jié)果回應(yīng)就像是一個(gè)Flash事件,你是為該事件編寫了一個(gè)事件處理方法。
17.3.1 調(diào)用遠(yuǎn)程服務(wù)方法
要調(diào)用存在于一個(gè)服務(wù)對(duì)象中的方法,可以使用服務(wù)對(duì)象名,后面跟一個(gè)應(yīng)用服務(wù)器方法名,就像下面的一行腳本語(yǔ)句:
weatherSvc.getTemperature("New York");
在本例中,方法getTemperature是位于應(yīng)用服務(wù)器上的一個(gè)公共方法或應(yīng)用程序網(wǎng)頁(yè) ,并且該方法也可以傳遞字符串格式的參數(shù):New York。也可以使用遠(yuǎn)程服務(wù)方法傳遞多個(gè)參數(shù),只需使用“逗號(hào)(,)”將參數(shù)隔開,例如下面的腳本代碼:
weatherSvc.getTemperature("New York", 1998, "average");
在本例中,遠(yuǎn)程服務(wù)方法傳遞了三個(gè)參數(shù):一個(gè)城市名(New York)、一個(gè)年份值(1998)和一個(gè)命令(average)。該方法用來求取1998年New York的平均氣溫。
注意:遠(yuǎn)程服務(wù)方法中的參數(shù)必須按照固定順序排列。
如果沒有在創(chuàng)建Service類實(shí)例時(shí)定義結(jié)果處理方法,那么可以在調(diào)用遠(yuǎn)程服務(wù)方法時(shí)定義一個(gè)Responder(回應(yīng))對(duì)象,用做結(jié)果處理的回應(yīng)對(duì)象;如果在創(chuàng)建Service類實(shí)例時(shí)已經(jīng)定義了結(jié)果處理方法,那么就不要在調(diào)用遠(yuǎn)程服務(wù)方法時(shí)再定義Responder對(duì)象了。
因此,定義Responder對(duì)象時(shí),一般有兩種方法:
l 為一個(gè)Service類實(shí)例的所有方法定義同一個(gè)Responder對(duì)象
l 為每一個(gè)方法定義不同的Responder對(duì)象
注意:在使用Connection對(duì)象的getService方法時(shí)定義了Responder對(duì)象后,就不要同時(shí)使用遠(yuǎn)程服務(wù)方法定義Responder對(duì)象。如果這樣做的話,F(xiàn)lash Remoting MX就會(huì)將遠(yuǎn)程服務(wù)方法中定義的Responder對(duì)象作為一個(gè)參數(shù)傳遞給遠(yuǎn)程服務(wù)方法,這樣程序就會(huì)出問題。
要為一個(gè)特定的遠(yuǎn)程服務(wù)方法定義結(jié)果處理方法,可以在定義方法的參數(shù)時(shí)將結(jié)果處理方法作為該方法的第一個(gè)參數(shù),例如下面的腳本:
weatherSvc.getTemperature( new temperatureResult(), "New York", 1998, "average" );
在該例中,名為temperatureResult的結(jié)果處理方法就用來接收和處理返回的調(diào)用結(jié)果,還包括getTemperature 遠(yuǎn)程服務(wù)方法的出錯(cuò)信息。
17.3.2 定義遠(yuǎn)程服務(wù)方法
為了使用Flash Remoting MX,你必須在應(yīng)用服務(wù)器上為Flash Remoting MX定義應(yīng)用遠(yuǎn)程服務(wù)方法。根據(jù)應(yīng)用服務(wù)器的種類不同,應(yīng)用遠(yuǎn)程服務(wù)方法也不相同,并且同一種類服務(wù)器所能夠應(yīng)用的應(yīng)用服務(wù)器方法名也不相同,在本書中僅介紹在.NET應(yīng)用服務(wù)器上為使用Flash Remoting MX創(chuàng)建應(yīng)用服務(wù)器的方法。
前面我們已經(jīng)簡(jiǎn)單地介紹了 .NET應(yīng)用服務(wù)器上可以作為Flash Remoting MX應(yīng)用服務(wù)器方法的Microsoft.NET技術(shù),包括ASP.NET網(wǎng)頁(yè)、Web服務(wù)和程序集方法。
下面,我們?cè)俅螐?qiáng)調(diào)一下,把這三種技術(shù)列在表17-4中。
表17-4 可以作為Flash Remoting MX應(yīng)用服務(wù)器方法的Microsoft.NET技術(shù)
ASP.NET網(wǎng)頁(yè)(.aspx)
|
網(wǎng)絡(luò)根目錄所在的目錄
|
ASP.NET網(wǎng)頁(yè)
|
DLL文件(.dll)
|
充分授權(quán)的類名
|
Public方法
|
.NET Web服務(wù)
|
命名空間
|
使用WSDL描述的網(wǎng)絡(luò)服務(wù)器方法
|
17.3.3 處理遠(yuǎn)程服務(wù)方法調(diào)用結(jié)果
當(dāng)應(yīng)用服務(wù)器返回遠(yuǎn)程服務(wù)方法調(diào)用的結(jié)果時(shí),事件處理方法就會(huì)應(yīng)用返回的數(shù)據(jù),或者處理返回的出錯(cuò)信息。
例如,結(jié)果處理方法可以在Flash影片應(yīng)用程序中顯示調(diào)用結(jié)果,而出錯(cuò)處理方法可以在Flash影片應(yīng)用程序中設(shè)置trace方法顯示出錯(cuò)信息。
對(duì)于使用Service類創(chuàng)建到遠(yuǎn)程服務(wù)的連接并調(diào)用遠(yuǎn)程服務(wù)方法的,以及可以使用RelayResponder 構(gòu)造器直接指定對(duì)象和事件處理方法的,你可以直接使用這里定義的對(duì)象和事件處理方法處理返回的結(jié)果或出錯(cuò)信息。
對(duì)于使用NetServices類和Connection類創(chuàng)建到遠(yuǎn)程服務(wù)的連接,并調(diào)用遠(yuǎn)程服務(wù)方法的,則有更多的選擇,你可以定義結(jié)果處理層級(jí)。
1.結(jié)果處理層級(jí)
Flash Remoting MX支持下列事件處理層級(jí):
(1)如果在使用Connection對(duì)象的getService方法時(shí)定義了Responder對(duì)象,那么Flash Remoting MX就會(huì)做下列事件:
①如果Responder對(duì)象中有一個(gè)形如functionName_Result的方法,并且functionName是調(diào)用的遠(yuǎn)程服務(wù)方法名,F(xiàn)lash Remoting MX就會(huì)將該方法調(diào)用的結(jié)果返回給與該方法同名的_Result方法。
②如果Responder對(duì)象中有一個(gè)名為onResult的方法,F(xiàn)lash Remoting MX就會(huì)將該方法調(diào)用的結(jié)果返回給該方法。
(2)如果在調(diào)用遠(yuǎn)程服務(wù)方法時(shí)定義了Responder對(duì)象,那么Flash Remoting MX就會(huì)將結(jié)果返回給該對(duì)象的onResult方法。
注意:在使用Connection對(duì)象的getService方法定義了Responder對(duì)象后,就不要同時(shí)使用遠(yuǎn)程服務(wù)方法定義Responder對(duì)象。如果這樣做的話,F(xiàn)lash Remoting MX就會(huì)將遠(yuǎn)程服務(wù)方法中定義的Responder對(duì)象作為一個(gè)參數(shù)傳遞給遠(yuǎn)程服務(wù)方法,這樣程序就會(huì)出問題。
(3)當(dāng)在Flash創(chuàng)作環(huán)境開發(fā)階段測(cè)試應(yīng)用程序時(shí),沒有定義一個(gè)Responder對(duì)象,那么Flash Remoting MX就會(huì)在“輸出”面板中顯示調(diào)用結(jié)果。
2.結(jié)果處理策略
不同的結(jié)果處理程序?yàn)殚_發(fā)人員提供了各種不同的結(jié)果處理策略,開發(fā)人員可以使用不同的策略來適應(yīng)應(yīng)用程序的需要。
下面我們來詳細(xì)介紹一下開發(fā)過程中要應(yīng)用的結(jié)果處理策略。
(1)使用getService方法定義Responder對(duì)象
如果使用gatewayConnection.getService方法定義Responder對(duì)象,那么可以應(yīng)用下面的技術(shù):
①在gatewayConnection.getService方法中定義一個(gè)對(duì)象(一般是主時(shí)間軸this)作為Responder對(duì)象,然后在主時(shí)間軸中為每一個(gè)遠(yuǎn)程服務(wù)方法創(chuàng)建一個(gè)單獨(dú)的_Result處理方法。
一般在滿足下列條件時(shí)使用該技術(shù):
l 對(duì)一個(gè)方法調(diào)用的_Result方法應(yīng)與對(duì)另一個(gè)方法調(diào)用的_Result方法不同
l 對(duì)于所有遠(yuǎn)程服務(wù)中的所有方法來說,每個(gè)一方法都有一個(gè)獨(dú)一無二的方法名。例如,你不能在兩個(gè)遠(yuǎn)程服務(wù)調(diào)用中使用相同名字的方法:myFirstService. myFunction和myOtherService.myFunction,這樣就會(huì)出問題,因?yàn)閮蓚€(gè)結(jié)果需要不同的處理過程
l 在一個(gè)遠(yuǎn)程服務(wù)中對(duì)一個(gè)特定方法的調(diào)用可以使用一個(gè)Responder對(duì)象處理
②在gatewayConnection.getService方法中定義一個(gè)對(duì)象(一般是主時(shí)間軸this)作為Responder對(duì)象,然后在主時(shí)間軸中創(chuàng)建一個(gè)onResult方法處理所有的遠(yuǎn)程服務(wù)方法調(diào)用結(jié)果。
這種技術(shù)只有在對(duì)所有遠(yuǎn)程服務(wù)方法的所有請(qǐng)求的結(jié)果可以使用一個(gè)方式進(jìn)行處理時(shí)才適用。
③使用前兩種方法的結(jié)合。在gatewayConnection.getService方法中定義一個(gè)對(duì)象(一般是主時(shí)間軸this)作為Responder對(duì)象,然后在主時(shí)間軸中為一些遠(yuǎn)程服務(wù)方法創(chuàng)建單獨(dú)的_Result方法,然后為其他的遠(yuǎn)程服務(wù)方法創(chuàng)建一個(gè)onResult方法處理這些遠(yuǎn)程服務(wù)方法調(diào)用的結(jié)果。
一般在滿足下列條件時(shí)使用該技術(shù):
l 一些遠(yuǎn)程服務(wù)方法的調(diào)用結(jié)果的處理機(jī)制與其他遠(yuǎn)程服務(wù)方法調(diào)用結(jié)果的處理機(jī)制不同
l 處理機(jī)制不同的所有遠(yuǎn)程服務(wù)調(diào)用中的方法有一個(gè)獨(dú)一無二的方法名
l 一些遠(yuǎn)程服務(wù)方法雖然方法名不同,但其調(diào)用結(jié)果的處理機(jī)制相同
l 對(duì)一個(gè)特定方法的不同調(diào)用,其調(diào)用結(jié)果可以使用一個(gè)Responder對(duì)象處理
使用處理層級(jí)的例子
下面的例子揭示了怎樣使用主時(shí)間軸作為Responder對(duì)象,并且為一些遠(yuǎn)程服務(wù)方法定義一個(gè)onResult結(jié)果處理方法,以及為其他的一些遠(yuǎn)程服務(wù)方法定義特定的functionName_Result結(jié)果處理方法。
在該例中,有兩個(gè)方法用于特定的functionName_Result結(jié)果處理方法,它們是getTemperature_Result和getForecast_Result(這兩個(gè)方法用來顯示返回的temperature和forecast)。而onResult結(jié)果處理方法用來在一個(gè)信息文本框中顯示結(jié)果:
//初始化連接
if (inited == null) {
inited = true;
NetServices.setDefaultGatewayURL
("http://localhost/flashservices/gateway.aspx");
gatewayConnection = NetServices.createGatewayConnection();
//定義主時(shí)間軸作為默認(rèn)的Responder對(duì)象
weatherService = gatewayConnection.getService("flashExamples.weatherStation",
this);
}
//結(jié)果處理方法
function getTemperature_Result(temperature) {
temperatureIndicator.text = temperature;
}
function getForecast_Result(forecast) {
forecastIndicator.text = forecast;
}
//默認(rèn)的回應(yīng)處理方法
function onResult(result) {
generalMessageBox.text = result;
}
//調(diào)用遠(yuǎn)程服務(wù)方法
weatherService.getTemperature("New York");
weatherService.getForecast("Chicago");
weatherService.getServiceStatus("San Francisco");
weatherService.getUsageStats();
(2)使用遠(yuǎn)程服務(wù)方法定義Responder對(duì)象
如果要在調(diào)用遠(yuǎn)程服務(wù)方法時(shí)定義Responder對(duì)象,可以使用下面的技術(shù):
①定義一個(gè)Responder對(duì)象。使用結(jié)果處理方法將結(jié)果值賦給一個(gè)Responder對(duì)象,可以將Responder對(duì)象的一個(gè)實(shí)例作為gatewayConnection.getService方法的一個(gè)參數(shù)傳遞給它。
使用這種技術(shù)比使用this作為Responder對(duì)象更加面向?qū)ο螅@允許你使用更加結(jié)構(gòu)化的代碼。
②定義幾個(gè)不同的Responder對(duì)象。使用結(jié)果處理方法將結(jié)果值賦給不同的Responder對(duì)象,可以將每一個(gè)Responder對(duì)象的一個(gè)實(shí)例作為serviceName.functionName調(diào)用時(shí)的一個(gè)參數(shù)傳遞給它。
該技術(shù)允許開發(fā)人員為特定Responder對(duì)象創(chuàng)建方法,在這種情況下,一些service應(yīng)有相同的方法名,但是返回的數(shù)據(jù)不同;該技術(shù)也允許開發(fā)人員為一個(gè)遠(yuǎn)程服務(wù)方法創(chuàng)建幾個(gè)不同的結(jié)果處理方法。
③使用上述兩種方法的結(jié)合。為一些遠(yuǎn)程服務(wù)方法使用多個(gè)Responder對(duì)象;為另一些遠(yuǎn)程服務(wù)方法使用單獨(dú)的一個(gè)Responder對(duì)象。
下面是在遠(yuǎn)程服務(wù)方法調(diào)用中為每一方法定義一個(gè)result對(duì)象的例子,與前面介紹的例子目的基本相同,但是我們?cè)谠摾倪h(yuǎn)程服務(wù)方法調(diào)用中為每一調(diào)用定義了回應(yīng)處理對(duì)象。
在該例中,有三個(gè)回應(yīng)處理對(duì)象,它們是tempResult、forecastResult和generalResult(這三個(gè)回應(yīng)處理對(duì)象分別用來顯示返回的temperature、forecast和其他的遠(yuǎn)程服務(wù)方法)。每一個(gè)回應(yīng)處理對(duì)象中有一個(gè)onResult結(jié)果處理方法用來處理遠(yuǎn)程服務(wù)方法調(diào)用返回的結(jié)果:
//初始化連接
if (inited == null) {
inited = true;
NetServices.setDefaultGatewayURL
("http://localhost/flashservices/gateway.aspx");
gatewayConnection = NetServices.createGatewayConnection();
//在創(chuàng)建Service類實(shí)例時(shí)不要定義默認(rèn)的Responder對(duì)象
weatherService = gatewayConnection.getService
("flashExamples.weatherStation");
}
//Temperature的結(jié)果處理對(duì)象
function tempResult() {
this.onResult = function(temperature) {
temperatureIndicator.text = temperature;
};
}
//Forecast的結(jié)果處理對(duì)象
function forecastResult() {
this.onResult = function(forecast) {
forecastIndicator.text = forecast;
};
}
//General的結(jié)果處理對(duì)象
function generalResult() {
this.onResult = function(result) {
generalMessageBox.text = result;
};
}
//調(diào)用遠(yuǎn)程服務(wù)方法,并指定結(jié)果處理方法的一個(gè)實(shí)例作為第一個(gè)參數(shù)
weatherService.getTemperature(new tempResult(), "New York");
weatherService.getForecast(new forecastResult(), "Chicago");
weatherService.getServiceStatus(new generalResult(), "San Francisco");
weatherService.getUsageStats(new generalResult());