劉波+周圣貢
摘要:了解應(yīng)用程序中異步通訊層的架構(gòu)是深入理解相關(guān)內(nèi)容的必要前提條件。ASP.NET程序采用AJAX時(shí)在物理上對(duì)于客戶和服務(wù)器端的異步通信層是分散的。該文將針對(duì)ASP.NET 的AJAX技術(shù)進(jìn)行研究,明確其異步通訊層的工作原理和體系結(jié)構(gòu)。
關(guān)鍵詞:asp.net;Ajax;異步通訊層;架構(gòu)
中圖分類(lèi)號(hào):TP393 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2015)10-0039-02
1 客戶端的體系架構(gòu)
ASP.NET應(yīng)用程序中AJAX技術(shù)是在客戶端實(shí)現(xiàn)異步通信,因此對(duì)于其客戶端的體系結(jié)構(gòu)將包含豐富的javascript組件來(lái)支撐其完成這些通信操作,具體組件如圖1所示。在此框架體系結(jié)構(gòu)圖中對(duì)于ASP.NET程序的AJAX異步通訊工作核心類(lèi)庫(kù)及相關(guān)組件的關(guān)聯(lián)有清晰的表示,眾多的Javascript組件可以分為兩大類(lèi):核心通信組件以及支持組件。
對(duì)于AJAX中核心的數(shù)據(jù)交互通信組件的重要作用就是對(duì)于客戶端和服務(wù)器之間建立高效的通信。在圖1中,WebRequest組件、Web Service代理、WebRequestManager組件、頁(yè)面方法代理、以及XMLHttp-Executor組件均屬于核心通信組件。
1.1 Web Service代理
在ASP.NET程序的AJAX技術(shù)開(kāi)發(fā)中,服務(wù)器端的異步通訊層可以自動(dòng)生成Web Service的客戶端代理。然后開(kāi)發(fā)者就可以在Javascript腳本中通過(guò)此Web Service代理很直接直觀地對(duì)服務(wù)器端的Web Service服務(wù)方法進(jìn)行調(diào)用。”代理”是指調(diào)用這類(lèi)代理的語(yǔ)法和服務(wù)器端代碼的調(diào)用語(yǔ)法非常類(lèi)似。關(guān)于客戶端的Web Service代理,與HTTP請(qǐng)求一樣,我們可以采用GET方式和POST方式調(diào)用服務(wù)器端的Web Service方法。
POST方式:當(dāng)使用超文本傳輸協(xié)議POST的方式調(diào)用Web Service服務(wù)時(shí),將要發(fā)送到服務(wù)器端的數(shù)據(jù)放在HTTP請(qǐng)求的主體部分。(避免使用GET方式時(shí)出現(xiàn)在其中的請(qǐng)求長(zhǎng)度限制。因此,如果沒(méi)有滿足GET請(qǐng)求長(zhǎng)度限制的條件,可使用POST方式調(diào)用Web Service)。在POST方式中,服務(wù)器端部分(異步通信層)會(huì)將該JSON格式并提交給服務(wù)器。然后,異步通訊層的服務(wù)器端部分把該JSON格式數(shù)據(jù)進(jìn)行反序列化操作并且轉(zhuǎn)換成.NET中對(duì)應(yīng)的類(lèi)型,然后再把該數(shù)據(jù)傳遞給相對(duì)應(yīng)的服務(wù)器端Web Service服務(wù)方法。在Web Service服務(wù)方法處理完成之后,服務(wù)器端部分(異步通訊層)會(huì)將最總的結(jié)果序列化成為JSON格式并且在經(jīng)過(guò)調(diào)用函數(shù)傳回給客戶端,客戶端部分(異步通訊層)再將它轉(zhuǎn)化為對(duì)應(yīng)的Javascript腳本對(duì)象,完成之后客戶端的應(yīng)用程序再進(jìn)行進(jìn)一步的業(yè)務(wù)處理。
GEST方式:使用超文本傳輸協(xié)議GEST方式調(diào)用Web Service的基本流程與POST方式的流程是非常類(lèi)似的。區(qū)別在于,因?yàn)橐獙鬟f給服務(wù)器端的數(shù)據(jù)會(huì)放置于URL參數(shù)中,所以會(huì)受到長(zhǎng)度上的限制。
ASP.NET AJAX異步通訊層中,客戶端使用POST方式作為Web Service代理的默認(rèn)調(diào)用方式,如果要使用GET方式進(jìn)行調(diào)用,那么需要為Web Method添加[ScriptMethod(UserHttpget=true)]屬性。
1.2 頁(yè)面方法代理
與客戶端的Web Service代理類(lèi)似,ASP.NET AJAX異步通訊層的服務(wù)器端部分同樣能夠?yàn)槎x在ASP.NET頁(yè)面中的靜態(tài)服務(wù)器端方法自動(dòng)生成客戶端的代理,因此也能夠大大簡(jiǎn)化在客戶端Javascript中的調(diào)用過(guò)程。
1.3 WebRequest組件
WebRequest組件是異步通訊層中的客戶端部分的“經(jīng)紀(jì)人”,用來(lái)收集發(fā)起異步HTTP請(qǐng)求所用到的參數(shù),例如請(qǐng)求的主題部分、請(qǐng)求的地址、超時(shí)設(shè)定以及用戶上下文信息等。一般來(lái)講,WebRequest組件是我們使用ASP.NET AJAX異步通訊層創(chuàng)建并發(fā)起一次HTTP請(qǐng)求中唯一需要打交道的客戶端組件[1]。當(dāng)然,若是該HTTP請(qǐng)求的目標(biāo)是某個(gè)Web Service或某個(gè)ASP.NET頁(yè)面中的靜態(tài)方法,那么則毫無(wú)疑問(wèn)應(yīng)該選用自動(dòng)生成的Web Service或頁(yè)面方法的客戶端代理,這樣將會(huì)更加簡(jiǎn)單。
1.4 XMLHttp-Executor組件
XMLHttp-Executor組件是異步通訊層客戶端部分中最為“勞苦功高”的“實(shí)干者”,它將使用原始的XMLHttpRequest對(duì)象完成客戶端與服務(wù)器端的通信工作。此外,XMLHttpExecutor類(lèi)繼承于WebRequestExecutor的基類(lèi),WebRequestExecutor基類(lèi)給上層調(diào)用者提供了客戶端與服務(wù)器端通訊工作的抽象,而WebHttpExecutor只是WebRequestExecutor的一種實(shí)現(xiàn)。
1.5 WebRequestManager應(yīng)用組件
WebRequestManager組件是AJAX中核心的組件之一,是異步通訊層操作時(shí)客戶端部分中的管理組件,為了保證異步通信流程的順暢,我們使用WebRequestManager組件來(lái)維護(hù)并協(xié)調(diào)WebRequest組件與XMLHttpExecutor組建之間的關(guān)系。
支持組件是指對(duì)Web Service或頁(yè)面方法代理進(jìn)行再次封裝的組件,包括身份驗(yàn)證代理和用戶個(gè)性化代理。實(shí)現(xiàn)客戶端/服務(wù)器端序列化功能的組件也屬于支持組件,即JSON序列化組件。服務(wù)器端驗(yàn)證服務(wù)自動(dòng)生成身份驗(yàn)證代理組件。通過(guò)使用這些組件,就可以在客戶端用Javascript腳本以異步的方式(Ajax的方式)回送,實(shí)現(xiàn)用戶的登錄和用戶注銷(xiāo)的功能,無(wú)需完成傳統(tǒng)方式中的一次整頁(yè)回送。用戶個(gè)性化代理組件是由服務(wù)器端個(gè)性化服務(wù)自動(dòng)生成的。與身份驗(yàn)證代理組件的功能非常類(lèi)似,通過(guò)使用用戶個(gè)性化代理組件,就可以在客戶端用Javascript腳本以Ajax異步回送的方式收集、修改或更新用戶的個(gè)性化信息,同樣避免了傳統(tǒng)方式中的一次整頁(yè)回送。JSON序列化組件能夠把需要發(fā)送給服務(wù)器端的數(shù)據(jù)序列化成JSON格式,還能夠?qū)⒎?wù)器端返回的JSON字符串解析成真正的Javascript對(duì)象。
2 服務(wù)器端架構(gòu)
ASP.NET AJAX異步通信層的服務(wù)器部分包含了若干個(gè).NET組件,與客戶端部分類(lèi)似,在ASP.NET AJAX異步通信層的服務(wù)器部分中,我們可以把.NET組件分為核心通信組件和支持組件兩大類(lèi)。
對(duì)于AJAX中核心的數(shù)據(jù)通信組件指的是用來(lái)實(shí)現(xiàn)和客戶端進(jìn)行交互所必需的.NET組件, Web Service網(wǎng)頁(yè)服務(wù)和頁(yè)面方法都屬于通信組件。在ASP.NET AJAX異步通信層的服務(wù)器部分中,Web Service服務(wù)組件用來(lái)進(jìn)行客戶端的異步請(qǐng)求的處理,然后根據(jù)需要實(shí)現(xiàn)或調(diào)用業(yè)務(wù)邏輯代碼指定的任務(wù),并將處理結(jié)果返回給客戶端。頁(yè)面方法是指定義在ASP.NET頁(yè)面中的服務(wù)器端靜態(tài)方法。在ASP.NET AJAX異步通信層的服務(wù)器端部分中,頁(yè)面方法的執(zhí)行方式以及功能與Web Service非常類(lèi)似。支持組件指的是實(shí)現(xiàn)應(yīng)用程序服務(wù)的客戶端代理的組件,包括用戶個(gè)性化服務(wù)和身份驗(yàn)證服務(wù)。實(shí)現(xiàn)反序列化、/服務(wù)器序列化、客戶端功能的組件也屬于支持組件包含JSON序列化和XML序列化。身份驗(yàn)證組件將自動(dòng)生成客戶端的身份驗(yàn)證代理組件,讓開(kāi)發(fā)者可以在客戶端Javascript中直接獲取、修改、更新與當(dāng)前請(qǐng)求相關(guān)的用戶個(gè)性化信息[2]。用戶個(gè)性化組件既可以為用戶提供服務(wù),也可以為匿名用戶服務(wù),這取決于ASP.NET中的相關(guān)設(shè)置。
服務(wù)器端的JSON序列化組件負(fù)責(zé)在常見(jiàn)的.NET類(lèi)型與JSON字符串之間進(jìn)行轉(zhuǎn)換。對(duì)于某些復(fù)雜類(lèi)型,我們也可以為該類(lèi)型自定義JSON序列化組件。服務(wù)器的XML序列化組件負(fù)責(zé)在服務(wù)器端XmlDocument類(lèi)型與XML字符串類(lèi)型之間進(jìn)行轉(zhuǎn)換,以便使用XML格式的字符串不是默認(rèn)的JSON格式字符串與客戶端進(jìn)行交互。
3 總結(jié)
異步通信功能是AJAX中的核心理念,本文介紹了ASP.NET AJAX異步通信層的基本架構(gòu),詳細(xì)地說(shuō)明了服務(wù)器端架構(gòu)、異步通信層的客戶端和其中的各個(gè)重要組件及其之間的關(guān)系。
參考文獻(xiàn):
[1] Esposito D. Microsoft ASP.NET AJAX導(dǎo)學(xué)[M].機(jī)械工業(yè)出版社,2008.
[2] 炎士.ASP.NET項(xiàng)目開(kāi)發(fā)案例精粹[M].北京: 電子工業(yè)出版社,2010.