[英文原文地址 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框架的一部分。
页面方法允许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并不是明智的选择。