ASP.NET 2.0當中的Call back技術與ASP.NET AJAX

前面介紹過了幾個ASP.NET當中的AJAX機制之後,不知道讀者是否偶而也有一些confuse,原因是有太多種方法可以在.aspx網頁上進行AJAX動作了,目前最常見的幾種方式是:
1) 傳統的HTTP request(要自己寫一些JavaScript code)
2) asp.net 2.0當中的Call Back技術(ASP.NET 2.0當中原生支援,不需要安裝任何套件)
3)安裝ASP.NET AJAX套件之後的 異步 Web Services Call
4)安裝ASP.NET AJAX套件之後的 異步 Page Method Call
5)安裝ASP.NET AJAX套件之後的 UpdatePanel

由於有很多讀者問到,同時也不少人有這方面的爭論或是疑惑,因此筆者分別針對這幾種方式稍做說明。

目前,只要您是ASP.NET的開發人員,我相信你會在2,3,4,5這幾種方法當中選一個,而最常用的可能是方法5。因為方法1這種傳統的Http Request不僅要撰寫相當多的JavaScript,並且很可能您要自己處理瀏覽器兼容與支援的相關問題,因此一般來說我們不太做這樣的用法。

而其中最簡單的則是方法5, 採用UpdatePanel,但是, 讀者要知道,上述各種AJAX技術當中,最耗費頻寬且效能最差的就是UpdatePanel,筆者在研討會常常碰到讀者詢問ASP.NET AJAX的效能不好(但是其實只有UpdatePanel的效能不是非常好,而且這還跟使用的方式有關...),因此在這邊筆者要再三強調,僅管你看到UpdatePanel 所謂的『partial postback 』 "似乎只是" 將一小塊區域回傳給伺服器端,但是實際測試後你會發現,在進行partial postback時,其實是 "整個頁面" 回傳給伺服器端(只是沒有換頁),而雖然reload回來的時候確實是局部的頁面,但是如果你加上了Timer一起用,肯定會造成可怕的網路流量...

而方法3的異步Web Services呼叫其實是筆者比較喜歡的方式,不管在執行效能或是原理架構上,都是蠻漂亮的AJAX用法,而方法4的PageMethod則是類似於方法3的一種簡易用法,不需要額外建立一個Web Services(.asmx),就可以在頁面當直接使用,是比較輕量級的方式,如果您的頁面上想要畫龍點睛的來一小段AJAX功能,方法4是不錯的選擇,而方法3則可以讓開發人員以正規的方式建立較為龐大的AJAX架構,例如撰寫一個AJAX版的開發平台,類別庫...等

而方法2呢?怎麼越來越少聽到筆者談起?可能有讀者以為ASP.NET AJAX出現之後我們就把它拋在一邊了,其實這個觀念不是非常的正確,您會發現Call Back技術依舊是目前 "撰寫支援AJAX功能的Web控制項" 最好的方式...

可能筆者提的很少,但是其實是因為台灣現在寫控件的人越來越少了,其實,您若深入研究就會發現,ASP.NET 2.0當中的Call Back機制不僅可以用在網頁上,也可以用在User Control和Web control,可以讓頁面(或控件)直接支援AJAX功能,是非常好用且筆者非常喜歡的一種做法,如果你的開發團隊當中,需要自行開發控件,而這些控件想要支援AJAX,Call Back技術是最理想的選擇...

而Extender Control呢?它不是也能來撰寫控見嗎?呵呵,沒錯,不過這又是另一個層面的問題了,也許下次有機會時後再跟大家報告一下這中間的差異...

留言

匿名表示…
董老師可以解釋一下為何說「台灣現在寫控件的人越來越少了」?是有什麼理由或現象?
匿名表示…
我想跟產業有關係,
或是分工更仔細了,寫控件的高手,少在檯面上運作
匿名表示…
要了解有關於控件方面的製作,國內的資源真的很少,雖然書上有帶到一兩章,期待老師有機會出專書
David寫道…
其實過去筆者有撰寫過一本相關的書籍,未來會在BLOG當中將這類的技術整理出來。
匿名表示…
我有寫一篇 UpdatePanel 與 CallBack 的效能比較的文章,供參考

http://www.dotblogs.com.tw/jeff377/archive/2008/03/17/1753.aspx
Unknown寫道…
董老師,從您的文章中可以看到2、3、4 的程式撰寫的簡易度是4>3>2,而在效能方面則是2>3>4,而在使用時機上也有明顯不同,那麼1、2的效能及使用時機呢?

這個網誌中的熱門文章

使用LM Studio輕鬆在本地端以API呼叫大語言模型(LLM)

VS Code的字體大小

使用 Dify 建立企業請假機器人

使用Qdrant向量資料庫實作語意相似度比對

使用C#開發LineBot(3) - 使用LineBotSDK發送Line訊息