为何ASP.NET AJAX UpdatePanels是危险的

[英文原文地址 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和响应是如何完成部分回发的:

为何ASP.NET AJAX UpdatePanels是危险的_第1张图片

很震惊,对吧?为了显示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 Response

使用JSON,整个HTTP一来回为24个字节,与UpdatePanel中的872个字节相比,整整提高了4000%,随着页面复杂度的增加其性能也会增加。

这不仅仅是显著地减少了网络带宽的使用,同时服务器无需实例化UpdatePanel控件,因此也无需维护其生命周期以将HTML发送回浏览器。

UpdatePanel的简单性是无可厚非的,这正是我们钟爱UpdatePanel的原因。不过在高负载的情况下,UpdatePanel并不是明智的选择。


你可能感兴趣的:(为何ASP.NET AJAX UpdatePanels是危险的)