[英文原文地址 http://encosia.com/why-aspnet-ajax-updatepanels-are-dangerous/]
[轉載請標明出處 http://blog.csdn.net/donhao/article/details/7218088]
你們如果跟我一樣,無法抗拒的在頁面上放置許多UpdatePanel來證明AJAX的強大性。使用UpdatePanel可以很方便的實現AJAX,甚至無需知道底層是如何?的。
不幸的是,用戶端和伺服器之間互動缺乏透明性,很容易砸到自己的(或者自己的應用)腳。讓我給你舉個例子,應該非常熟悉,如下:
<asp:UpdatePanel runat="server" ID="up1"> <ContentTemplate> <asp:Label runat="server" ID="Label1" Text="Update Me!" /><br /> <asp:Button runat="server" ID="Button1" Text="Postback Update" OnClick="Button1_Click" /> </ContentTemplate></asp:UpdatePanel>
protected void Button1_Click(object sender, EventArgs e){ Label1.Text = DateTime.Now.ToLongDateString();}
夠簡單的了,點擊Button1之後,通過一個非同步請求來獲得當前的時間,然後該時間會作為Label1的內容。看起來非常簡單,不過來看一下實際的HTTP的Post和響應是如何完成部分回傳的:
很震驚,對吧?為了顯示22個字元,卻收發了相當多的資料。在不太常使用的功能中問題不大,不過在使用率很高的情況下情況會變糟糕。幸運的是,微軟提供了一種更為高效的方式來實現,其作為ASP.NET AJAX架構的一部分。
頁面方法(Page Method)
頁面方法允許ASP.NET AJAX頁面使用JSON (JavaScript Object Notation)直接執行頁面的靜態方法。JSON可以看作是SOAP的簡化版本,非常適合用戶端和伺服器之間的輕量級通訊。至於如何?頁面方法和JSON,看看微軟的Exposing
Web Services to Client Script in ASP.NET AJAX.
不在通過回傳然後接收HTML標記來替換全部的UpdatePanel中的內容,而是使用Web方法來請求我們只感興趣的資訊:
<asp:ScriptManager ID="ScriptManager1" runat="server" EnablePageMethods="true" /><script language="javascript"> function UpdateTime() { PageMethods.GetCurrentDate(OnSucceeded, OnFailed); } function OnSucceeded(result, userContext, methodName) { $get('Label1').innerHTML = result; } function OnFailed(error, userContext, methodName) { $get('Label1').innerHTML = "An error occured."; }</script><asp:Label runat="server" ID="Label1" Text="Update Me!" /><br /><input type="button" id="Button2" value="Web Method Update" onclick="UpdateTime();" />
public static string GetCurrentDate(){ return DateTime.Now.ToLongDateString();}
通過這種方法,我們完全消除了UpdatePanel的請求中的HTTP POST資料,同時也將響應的資料減少到我們僅感興趣的請求資訊:
使用JSON,整個HTTP一來回為24個位元組,與UpdatePanel中的872個位元組相比,整整提高了4000%,隨著頁面複雜度的增加其效能也會增加。
這不僅僅是顯著地減少了網路頻寬的使用,同時伺服器無需執行個體化UpdatePanel控制項,因此也無需維護其生命週期以將HTML發送回瀏覽器。
UpdatePanel的簡單性是無可厚非的,這正是我們鐘愛UpdatePanel的原因。不過在高負載的情況下,UpdatePanel並不是明智的選擇。