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

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

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

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

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