| ||||||
在這里我將試圖考察一下目前.NET平臺的下的Ajax框架,我也試圖從中總結出來一種方法,使得你可以在眾多基于.NET平臺的Ajax框架和工具包中找到你所合適的一種,同時也希望你在考察、預研和使用這些流行的這些Ajax-NET的框架時,做得理性和有的放矢。 目前在wwHoverPanel的場景中,我認為這是一種輕量級的實現,對于多層嵌套多組引用的對象圖類型或是大規(guī)模容量訪問壓力下,客戶端和服務器端都還需要優(yōu)化,所以如果其作為Ajax架構,客戶端和服務器端通信和傳遞數據的通訊層上,顯然是有些單薄了。 wwHoverPanel的一些不足和想法: 1)該控件是目前我見過.NET平臺下,惟一同時支持客戶端回調和頁面方法調用的Ajax控件,同時又支持兩路雙向的序列化。 2)相對來說,wwHoverPanel是設計最簡單的一個,而且是基于控件不依賴HTTPModel和ASP.NETPagePipeline,也不依賴ViewState 3)該控件能夠讓你在Ajax特性實現的技術層面上,能夠在客戶回調和客戶端調用頁面方法兩者中取得平衡。 4)目前的客戶端回調支持其它頁面的回調,但是其結果輸出需要輸出原始的HTML,這個影響應用的分層和設計。 5)JSON的雙向序列化是一個不錯的方案,但高性能的場景下,應該考慮實現更高效的序列化框架。 4.Atlas 這個產品,我就不列舉具體的功能了,而主要說一下我對其的看法和持有的態(tài)度。因為在我的Ajax書評中提到過問題。 Atlas是一個個性鮮明的產品,其優(yōu)點是明顯的,缺點也是明顯的,但首先你必須認識到它還是一個比較復雜,擁有較高學習曲線的解決方案。對于其復雜性,老實說目前,大多數人還缺乏真實的感受。 最近的一個個版本-JanCTP,我們看到了一些特性,其強大之處在于: 1.客戶端(Javascript)的數據綁定、校驗帶來便利。 2.新的UpdatePanels不僅擁有了MagicAjax.NET的特性,而且功能更強,是目前Atlas中異步回調的主要控件。 3.內置了一些具體Ajax特性的控件,比如AutoCompleteExtender,DragOverlayExtender 4.提供了一些使用的控件比如,ScriptManager,Triggers,TimerControl 5.主要用途著重在提供一個客戶端控件和服務器端控件的特性集成的方案和容易使用的開發(fā)效率上。 但缺點也是明顯的,比如: 1.客戶端的Behaviors還很弱,模板(Templates)和UI增強(UIEnhancements)功能還沒有看到。 2.所謂的客戶端Atlas控件(“Atlas”ClientControls)和服務器端的Atlas控件(“Atlas”ServerControls)還沒有一個明確的規(guī)范,所以現在你基本上還不能創(chuàng)建自定義的Atlas控件(無論客戶端還是服務器端的)。 3.目前還只支持調用WebServices的服務,對于ASP.NET的內置的服務以及WCF的服務支持也沒有看見,也不支持頁面或控件內的方法調用 4.功能上還不穩(wěn)定,一些功能僅是在特定條件下的特性實現,還不能滿足部署生產環(huán)境的要求。我認為,如果Atlas發(fā)布Go-LiveLicense,那么可以考慮Atlas的放入到正式的項目或應用中。 我并不建議,你現在就將它應用在一個老的ASP.NET項目中,或是老項目遷移到ASP.NETv2.0時優(yōu)先考慮它;更多時候,如果你是創(chuàng)建一個新的ASP.NET應用,而又跨越了其學習曲線的情況下,可以考慮使用它。目前的情況下,對于Atlas,我建議,你應該保持足夠的關注和實踐學習,但是要抑制住將其應用到項目中的興趣;因為Ajax,你現在可以開始關注和學習它,但是你不能因為要實現Ajax一個特性,而立即選擇Atlas,那么是可能有風險的。 注:Atals的Microsoft.Web.Script.Serialization命名空間中有JavaScriptObjectDeserializer和JavaScriptObjectSerializer兩個對象,第一,我不確定其是否也是JSON序列化,而且我也不確定目前是否支持兩路雙向的序列化;第二,目前的版本,我還不能進行自定義或擴展,同時也很難對于其性能做任何的結論。 之前我提到過“似Ajax”的架構,現在我要說的Ajax框架也就是指專門針對這種Ajax架構而提供的框架。目前,我還沒有聽說過特別好的這個領域的流行框架。但我知道我的身邊,.NET領域,J2EE領域或PHP平臺上都有這樣的框架和應用,我認為,正是因為有很多這樣應用,所以Ajax才會像某個模式一樣,被撰有一個專門的名詞。不過我感覺Ajax漸漸變成了Ajaxfeature的代名詞,變成了XMLHTTP的代名詞,成了異步通訊,不刷新頁面的技術表示法。直到我看過AjaxinAction這本書,我才把Ajax和系統(tǒng)的架構、設計模式,分布式對象的序列化和我之前的項目和經歷聯系在一切。 我修改了一些Jesse的圖,來說明我認為的基于Ajax的架構是什么樣的。 簡單的說,客戶端需要將請求的數據封裝成一個XML數據通過HTTP傳遞給服務器端,服務器端處理這個請求,并將結果也以XML的形式返回到客戶端,客戶端再處理這些請求,然后使用HTML+CSS進行展示。其實如果不是Web客戶端(瀏覽器)的問題,這是最簡單的架構,但關鍵問題在于上面我們說的Javascript端的對象封裝成一個XML,以及到服務端解析XML變成服務器端對象,然后再將結果封裝成XML,傳回給客戶端(Javascript),客戶端也解析XML數據,然后變成Javascript中的對象的這個序列化和反序列化的問題。另外一個問題就是表現層的展現問題,怎么展現,用什么控件? 所以,一個Ajax架構的Web應用程序,必須解決下面的問題: 1.雙向兩路的序列化問題 2.表現層展現的問題 3.傳輸時客戶端和服務器端的數據安全問題 4.性能問題 5.國際化支持 最好玩的雙向兩路的序列化問題,最早接觸的是JSON,它的問題在于擴展性,數據類型的支持和性能,但是平臺無關性比較好,什么瀏覽器都可以,因為它不需要用msxml2.DOMDocumen分析XML,本質上就是用字符串描述對象;之后多平臺的應用的遷移經歷中(比如CORBAR,J2EE的后臺應用),開始接觸到XML-RPC,ICE,Hessian,WebServices等等。其中XML-RPC有Javascript的支持庫,WebServices也有Javascript的支持庫,也就是你可以使用Javascript訪問或者獲得XML-RPC/WebServices的對象,但是如果你將其作為一個主要的通訊協(xié)議,那么就會遇到另外一些問題,比如性能、國際化的問題,又會困擾你,XML-RPC和WebServices的一個主要問題都是性能,因為他們傳輸的XML大小都太大了,但顯然用這些實現一個Ajax的特性,那是完全沒有問題了。 比如,Atlas目前不也是使用一個Javascript庫調用WebServices嗎?,所以,你也可以這么做,同樣你也可以用XML-RPC.NET很快就可以實現一個Service,然后使用Scotandrew的XML-RPCjavascript庫就可以在Javascript中發(fā)一個XML-RPC消息請求這個服務,然后異步的獲得這個結果,然后展現它。所以從技術的實現上講,Ajax的特性非常容易實現,但從架構上來看。你需要思考更多的因素。當然直到最后,我們才發(fā)現,在項目中,最完美的方案是你自己寫一個雙向兩路的序列化引擎供你的Javascript客戶端使用。 這就說到了第二個問題,界面表現的問題,這個問題也是一個大的問題。這個問題一直會永遠存在,Ajax之前沒有人會太注意這些,但今天不同了,我想未來還會有很大的一個飛躍,Yahoo!不是最近也開源了他的Yahoo!WebUI庫,Atlas也表示要提供更多的前端UI控件。無論如何,這個問題是,你的團隊或組織是否有一套經過項目或客戶檢驗的前端Javascript的庫。無論是自己用Javascript寫的也好,是自己寫的一套HTC的控件庫也好,總之這些是Ajax架構中非常重要的一環(huán)。 Atlas帶來了另外一個思考問題,就是服務器端控件可能可以通過某種方式和Javascript的控件很好的集成在一起,以前我們用HTC解決了重用、性能、Behaviors、甚至模板功能。但是新的特性還是有比如數據的綁定、緩存和校驗、甚至是數據編碼和壓縮、加密和解密,JavascriptUI前端還是有許多可以做的,而且如何無縫的集成兩者,這個有非常大的意義。 接著安全、性能、國際化等等,架構中的問題需要你依次考慮和解決,如果這么看Ajax,我認為,目前的Ajax框架還有很長很長一段路要走,同樣真正完美支持Ajax架構的還需要繼續(xù)努力。這些也是我在這篇專欄文章中的觀點。 把這些合在一起,那么Ajax架構的開發(fā)包或框架,就應該是包含了上述幾個問題(兩路雙向的序列化、JavascriptUI表現庫、安全、國際化和性能等等)解決方案的一個平臺實現。 同樣也許你會說,不就是Ajax嗎?我干嘛要搞這么復雜,一定要搞到架構這個層面。 我認為, 第一,從架構的層面看Ajax,然后再應用相關的技術,比你直接使用某個Ajax框架然后再理解Ajax,你會從這個過程中收獲更多。 第二,對于一個開發(fā)團隊/組織來說,真正Ajax架構的產品,可以帶來效益和具體的生產力。比如,我身邊就有擁有這樣的優(yōu)勢的團隊,他們擁有一套統(tǒng)一的由Javascript+HTML+CSS+HTC的前端表現層,而后臺的業(yè)務系統(tǒng)有兩個平臺,一個.NET平臺和J2EE平臺;同樣我身邊的也有這樣的團隊,他們擁有一套統(tǒng)一的由Javascript+DHTML+CSS+HTC+VML+ASP.NET的前端表現層,但他們的后臺業(yè)務層分別來自.NET平臺、J2EE平臺和Unix平臺,我不能說Ajax架構的應用似乎就是統(tǒng)一Web表現層。因為從今天看到他們的明天,也許會是,一個ASP.NETV2+Atlas的統(tǒng)一表現層,一個統(tǒng)一CAB+SmartClient的統(tǒng)一表現層,也可以是一個WPF3D的統(tǒng)一表現層,也可以是一個Xgl桌面的統(tǒng)一層...... 第三,從這架構的層面上,你也能夠非常容易理解SOA或ESB概念,和SOA相比,Ajax架構的區(qū)別在于,Ajax有足夠的松散耦合,但它依然以應用的數據為中心,更多的是一個面向Messages的架構,而且對于流行的WS-*協(xié)議的支持非常有限。 但是假如,今天你或你的團隊已經有了一個Ajax架構的應用,那么你是不是應該要小心選擇現有的Ajax框架,因為這些Ajax的特性,相對于目前的架構來說,是多么小,但又可能會產生很大危害的一個因素。也許這樣的團隊并不多,也許也很多,但是只有我們從更高更深的層次來思考,那么我們就能做出正確的選擇,并且從新的Ajax技術和研究中獲得好處。 結論 當我們回到文章的起點,我希望這樣能夠說明的我觀點,即Ajax-NET的框架或實現分為兩類,一類是基于Ajax應用程序架構的,一類是基于Ajax特性的,目前幾乎大部分的Ajax-NET的框架或實現都是基于Ajax特性,以Add-in方式提供的代碼或框架。 Ajax-NET的實現/框架選取上的建議: ASP.NET控件形式已經成為連接服務器和客戶端Ajax通信的主要形式和選擇。 客戶端調用服務器端頁面中的方法是Ajax的重要手段,使得客戶端可以更加靈活的獲得服務器端的數據。 MagicAjax.NET,Anthem.NET用了“HookASP.NET”和Add-In的技術手段,使用上受到的影響比較多,這兩個框架中,最簡單的應用,第一選擇MagicAjax.NET,但總是優(yōu)先使用Anthem.NET。 如果是自己寫的服務器端控件,那么應該先掌握Anthem.NET的技術,然后使自己的控件擁有Ajax的特性。 MagicAjax.NET,Anthem.NET和wwHoverPanel對于國際化的支持都有待加強。 在Atlas沒有正式發(fā)布之前,在ASP.NET的應用中優(yōu)先在自己的項目中使用類似wwHoverPanel的技術,即盡可能的使用客戶端回調功能,在特別需要的地方使用其方法調用的功能,充分發(fā)揮Ajax的特性,而不要因為Ajax而特意選擇某個Ajax的框架。 Atlas的強項在于服務器端和客戶端控件特性的集成、客戶端的數據綁定、校驗、內置的多個客戶端Ajax特性UI或組件,與ASP.NET的Profile,Membership,Role服務的集成,與WebServices和WCF服務的集成,以及良好的國際化/開發(fā)工具支持的。因為它是一個完整的解決方案,所以最大的弱點是不能很容易地被老的Ajax架構的應用使用。另外該產品目前還在不斷開發(fā)中,距離部署到生產環(huán)境中的要求還有差距。 輕量級的雙向序列化可以考慮JSON格式,安全問題可以在傳遞的對象中增加字段,然后在服務器端進行校驗。 對于原來已經有一套序列化框架的組織來說,其主要的目標是盡快將這個框架遷移/升級到ASP.NETV2,而不是優(yōu)先考慮實現某個Ajax的特性。 Ajax要求有足夠的力量關注前端的UI展現或開發(fā),所以對Ajax實現/框架的選擇,最先要考察其客戶端的實現以及提供的WebUI。 看完這篇文章,我希望,今后我們再談起Ajax的時候,作為技術人員,我不用談論什么Web2.0,我一樣可以清楚的表達Ajax的概念 對于你的團隊或老板來說,Ajax可以是你統(tǒng)一界面表現層的一個策略,同樣也可能讓你有了一個創(chuàng)建一套部門或公司級能夠重用的UI類庫的機會。 同樣對于Javascript的開發(fā)人員來說,Ajax讓你們還需要了解一些業(yè)務,并證明前臺的Web開發(fā)人員一樣很昂貴,后臺開發(fā)也可以是技術含量不高的。 對于SOA的愛好者來說,Ajax架構讓你能夠站在面向消息的架構和系統(tǒng)上來看面向服務;一般我們說,對內你首先要有一套面向消息的架構,然后對外你就很容易延伸成一個面向服務面向Internet的分布式架構。 最后,不要討論Ajax的消亡,因為Ajax對于程序員來說,是一種力量均衡的策略,在Ajax中,Web前端的開發(fā)人員被重新重視,成為一支重要的力量。 后記 寫這些文字的某幾個段落,讓我有些痛苦,因為我本來沒想些這么多。所以你不要太在意我對各個框架的評價和描述,這些都是技術的層面的東西,其實我寫這篇文字,主要是想突出Ajax的架構觀,以及設計模式和Web應用架構重構的考慮,續(xù)而你也能夠用類似橫切面的角度,用Ajax來看你目前的應用和架構,從而更深的了解分布式對象的序列化、性能、安全以及Ajax和ASP.NET服務器端控件的融合。最后歡迎大家斧正。 |
聯系客服