`
javatoyou
  • 浏览: 1008015 次
  • 性别: Icon_minigender_2
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

结合UpdatePanel实例讲解ASP.NET的页面缓存技术

 
阅读更多

ASP.NET Page是个非常强大的模型,缓存是它的重要特性。本文结合UpdatePanel的简单实例讲解ASP.NET的缓存技术。如果一个页面已经使用了缓存,我还没有想到一个操作简单,但又能保持其缓存特性的解决方案。另外,我甚至想合理利用这种缓存机制来提高异步更新时的性能(也就是尝试着让页面缓存异步更新的内容)。

我查阅了ASP.NET Page缓存的资料,作了一些尝试,但是依旧无法得出一个比较好的解决方案。可能的确是scriptManager替代页面输出方法造成的问题吧,既然无法在那时处理缓存,又如何能够避免页面缓存的问题,甚至利用缓存来提高性能呢?

ASP.NET Page是个非常强大的模型,缓存是它的重要特性。一个成熟的ASP.NET应用程序几乎都会使用缓存,它能够显著得提高性能,减少服务器端生成页面或者 控件内容的消耗。不过现在出现了UpdatePanel这个“神奇”的控件,如果使用缓存不当,就会让我们的应用程序出现错误。


UpdatePanel的功能大家一定都非常熟悉了。无论是官方还是社区里热心推广ASP.NET AJAX的朋友,都会对于UpdatePanel的使用进行大量说明与展示。

但是在这些简单的的示例似乎都遗漏了一个非常重要的问题,这个问题会直接导致UpdatePanel无法正确使用。

这个问题就是ASP.NET Page的缓存。


重现问题

我们还是来编写一个使用UpdatePanel的简单示例,如下:

CachedPage.aspx

  1. <%@PageLanguage="C#"AutoEventWireup="true"%>
  2. <%@OutputCacheDuration="100"VaryByParam="None"%>
  3. <!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN"
  4. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  5. <htmlxmlns="http://www.w3.org/1999/xhtml">
  6. <headrunat="server">
  7. <title>CachedPage</title>
  8. </head>
  9. <body>
  10. <formid="form1"runat="server">
  11. <asp:scriptManagerID="scriptManager1"runat="server"/>
  12. <asp:UpdatePanelID="UpdatePanel1"runat="server">
  13. <ContentTemplate>
  14. <%=DateTime.Now.ToString()%>
  15. <asp:ButtonID="Button1"runat="server"Text="AsyncPostBack"/>
  16. </ContentTemplate>
  17. </asp:UpdatePanel>
  18. <asp:ButtonID="Button2"runat="server"Text="PostBack"/>
  19. </form>
  20. </body>
  21. </html>

我们打开页面,依次做一下操作,并察看页面上显示的时间。

多次刷新页面,时间不会改变。
多次点击Async PostBack按钮,页面部分刷新,时间每次都会改变。
多次点击PostBack按钮,页面完全刷新,时间只会更新一次,然后时间保持不变。
点击Async PostBack按钮,发生错误。
直到等待时间超过100秒(Cache过期),点击Async PostBack才工作正常,直到用户再次点击过PostBack按钮。

分析问题

使用Fiddler等工具察看出现错误时的Response Body,会发现页面返回了整张页面的内容,而不是UpdatePanel熟悉的特殊的字符串。要说明这个问题,需要再了解一下UpdatePanel的工作方式。

点击Async PostBack按钮之后,客户端采集页面上所有的信息,使用XMLHttpRequest发起一个请求,并且会在请求的Header信息中设置一个x-microsoftajax的值为Delta=true。
服务器端的Page页面接受到请求之后,并不会得知这是由XMLHttpRequest发出的请求,因此和常规一样进行页面中所有的工作,例如触发控件事件等等。
页面上的scriptManager控件在OnInit时,一旦发现Request的Header里有正确的x-microsoftajax信息,将会意识到目前在进行异步的PostBack。
如果scriptManager得知现在正在异步PostBack,则在OnPreRender时调用Pate.SetRenderDelegate方法,提供自定义的方法用于输出页面。
在自定义的输出方法中,scriptManager采集所有的信息(例如哪些UpdatePanel进行了更新,需要输出的脚本等等),并且输出客户端能够识别的内容。
客户端收到信息后,对其进行分析,并且更新页面。
在正常情况下,这个流程应该顺利的跑完,但是如果页面内容在服务器端被缓存了呢?将会出现下面的情况:

点击Async PostBack按钮,客户端采集页面上所有的信息,使用XMLHttpRequest发起一个请求。
Page在接受到请求之后,发现页面中存在缓存信息、并且缓存没有过期,于是直接输出缓存中的页面内容。
客户端收到了完整的页面内容,无法识别,抛出异常。


但是为什么在出现一个传统的PostBack之前,异步PostBack都能够正常工作呢?我怀疑这是因为ASP.NET的Page对象是在 Render时一并处理缓存的,当scriptManager替换了Page自带的方法后,就不会对输出内容进行缓存了。这导致了接下来的异步更新发生了 错误。这里是我根据出现的状况进行的猜测,哪位朋友如果了解ASP.NET Page缓存的确切情况,请不吝指教。:)

解决问题

说实话,如果一个页面已经使用了缓存,我还没有想到一个操作简单,但又能保持其缓存特性的解决方案。另外,我甚至想合理利用这种缓存机制来提高异步 更新时的性能(也就是尝试着让页面缓存异步更新的内容)。我查阅了ASP.NET Page缓存的资料,作了一些尝试,但是依旧无法得出一个比较好的解决方案。可能的确是scriptManager替代页面输出方法造成的问题吧,既然无 法在那时处理缓存,又如何能够避免页面缓存的问题,甚至利用缓存来提高性能呢?

如果要让UpdatePanel正常工作的话,只能取消页面级别的缓存了。不过控件级别的缓存还是能够使用的,下面的例子就可以看到控件缓存与UpdatePanel同时工作时的状况:

CachedControl.ascx

  1. <%@ControlLanguage="C#"AutoEventWireup="true"%>
  2. <%@OutputCacheDuration="100"VaryByParam="None"%>
  3. <%=DateTime.Now.ToString()%>CachedControl.aspx
  4. <%@PageLanguage="C#"AutoEventWireup="true"%>
  5. <%@RegisterSrc="CachedControl.ascx"TagName="CachedControl"TagPrefix="uc1"%>
  6. <!DOCTYPEhtmlPUBLIC"-//W3C//DTDXHTML1.0Transitional//EN"
  7. "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
  8. <htmlxmlns="http://www.w3.org/1999/xhtml">
  9. <headrunat="server">
  10. <title>CachedControl</title>
  11. </head>
  12. <body>
  13. <formid="form1"runat="server">
  14. <asp:scriptManagerID="scriptManager1"runat="server">
  15. </asp:scriptManager>
  16. <asp:UpdatePanelID="UpdatePanel1"runat="server">
  17. <ContentTemplate>
  18. <uc1:CachedControlID="CachedControl1"runat="server"/>
  19. <br/>
  20. <%=DateTime.Now.ToString()%>
  21. <asp:ButtonID="Button1"runat="server"Text="AsyncPostBack"/>
  22. </ContentTemplate>
  23. </asp:UpdatePanel>
  24. <asp:ButtonID="Button2"runat="server"Text="PostBack"/>
  25. </form>
  26. </body>
  27. </html>

在这里,我们把缓存加于CachedControl控件上,打开CachedControl.aspx之后并进行多次传统PostBack和异步PostBack都不会出现问题,从页面上两个不同的时间也可以看出控件的缓存生效了。


分享到:
评论

相关推荐

    Ajax结合GridView、UpdatePanel的ASP.NET操作实例

    Ajax结合GridView、UpdatePanel的ASP.NET操作实例! 值得下载看看!资源免费,大家分享!!

    asp.net UpdatePanel的简单用法

    UpdatePanel的简单用法: 局部更新是ajax技术的最基本,也是最重要的用法,今天大概把asp.net ajax中的局部更新控件 updatepanel的用法记录下,大家可以共同探讨

    ASP.NET_AJAX入门系列:使用UpdatePanel控件.doc

    ASP.NET_AJAX入门系列:使用UpdatePanel控件.docASP.NET_AJAX入门系列:使用UpdatePanel控件.doc

    Ajax 操作实例 ASP.NET实例

    Ajax 操作实例 Ajax结合GridView、UpdatePanel

    ASP.NET AJAX入门系列:使用UpdatePanel控件

    ASP.NET AJAX入门系列UpdatePanel控件教程

    ASP.NET_AJAX入门系列

    ASP.NET_AJAX入门系列:使用UpdatePanel控件.doc ASP.NET_AJAX入门系列:使用客户端脚本对UpdateProgress编程.doc ASP.NET_AJAX入门系列:在多个UpdatePanle中使用Timer控件.doc ASP.NET_AJAX入门系列:在母版页中...

    Asp.net Popup Control

    PopupControl 是一个可以在 ASP.Net 页面上“弹出”一个界面部分的 ASP.Net AJAX 控件。 这个控件多半会和 ASP.Net AJAX 控件 UpdatePanel 一起使用,因为它内部一般将执行复杂的服务器端事件。 在这个“弹出”的...

    [ASP.NET.AJAX编程参考手册(涵盖ASP.NET.3.5及2.0)].(美)霍斯拉维.扫描版.pdf

    ASP.NET AJAX将ASP.NET/.NET Framework中的服务器端编程技术引入到客户端框架,从而带来了客户端编程的丰富特性。本书主要阐述ASP.NET AJAX是如何在客户端模拟这些丰富特性的。 本书通过大量实例、深入的描述以及...

    ASP.NET AJAX经典范例168 VC#版 (代码) Part 12

    主要内容包括:ASP .NET AJAX技术慨述、实现异步局部更新页面、UpdatePanel编程功能、 PageRequestManager的使用方法、Timer控件、Control Toolkit方法、结合 OOP功能、如何在客户端JavaScript调用web服务、如何从...

    ASP.NET AJAX实战源码

    4.1 ASP.NET开发人员的Ajax 86 4.2 改进原有ASP.NET网站 87 4.2.1 一个示例ASP.NET网站 88 4.2.2 配置现有的ASP.NET网站 88 4.3 ScriptManager: Ajax页面的大脑 90 4.3.1 理解ScriptManager 90 4.3.2 部署...

    ASP.NET AJAX经典范例168 VC#版 (代码) Part 7

    主要内容包括:ASP .NET AJAX技术慨述、实现异步局部更新页面、UpdatePanel编程功能、 PageRequestManager的使用方法、Timer控件、Control Toolkit方法、结合 OOP功能、如何在客户端JavaScript调用web服务、如何从...

    ASP.NET AJAX经典范例168 VC#版 (代码) Part 11

    主要内容包括:ASP .NET AJAX技术慨述、实现异步局部更新页面、UpdatePanel编程功能、 PageRequestManager的使用方法、Timer控件、Control Toolkit方法、结合 OOP功能、如何在客户端JavaScript调用web服务、如何从...

    ASP.NET AJAX经典范例168 VC#版 (代码) Part 14

    主要内容包括:ASP .NET AJAX技术慨述、实现异步局部更新页面、UpdatePanel编程功能、 PageRequestManager的使用方法、Timer控件、Control Toolkit方法、结合 OOP功能、如何在客户端JavaScript调用web服务、如何从...

    ASP.NET AJAX经典范例168 VC#版 (代码) Part 8

    主要内容包括:ASP .NET AJAX技术慨述、实现异步局部更新页面、UpdatePanel编程功能、 PageRequestManager的使用方法、Timer控件、Control Toolkit方法、结合 OOP功能、如何在客户端JavaScript调用web服务、如何从...

    ASP.NET AJAX

    ajax技术,无刷新技术 导读:ScriptManager控件包括在ASP.NET 2.0 AJAX Extensions中,它用来处理页面上的所有组件以及页面局部更新,生成相关的客户端代理脚本以便能够在JavaScript中访问Web Service,所有需要支持...

    jQuery-ASP.NET-UpdatePanel:在ASP.NET UpdatePanel中使用jQuery

    在ASP.NET UpdatePanel中的jQuery 在ASP.NET UpdatePanel中使用jQuery 在CodeProject中也有关于此主题的文章。 单击此处: :

    asp.net CKeditor 3 用户自定义控件 解决UpdatePanel下问题

    由于本人资源分很少,所以设置1分,没分的同学可以访问我的博客...不过目前还没找到 .net直接调用的dll所以自己写了一个控件和大家分享下.集成ckfinder,本次解决了UpdatePanel 下不能使用ckeditor的问题,特来和大家分享。

    ASP.NET—015:ASP.NET中无刷新页面实现

    文章: http://blog.csdn.net/yysyangyangyangshan/article/details/39679823

    ASP.NET3.5从入门到精通

    4.5 ASP.NET 页面生命周期 4.6 ASP.NET 生命周期中的事件 4.6.1 页面加载事件(Page_PreInit) 4.6.2 页面加载事件(Page_Init) 4.6.3 页面载入事件(Page_Load) 4.6.4 页面卸载事件(Page_Unload) 4.6.5 页面...

Global site tag (gtag.js) - Google Analytics