`

12、使用页面输出缓存

阅读更多
使用页面输出缓存

可以给页面添加<%@ OutputCache%>指令启用页面输出缓存。

CachePageOutput.aspx
<%@ Page Language="C#" %>

<%@ OutputCache Duration="15" VaryByParam="none" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">

    protected void Page_Load(object sender, EventArgs e)
    {
        lblTime.Text = DateTime.Now.ToString("T");
    }
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:Label ID="lblTime" runat="server" />
    </div>
    </form>
</body>
</html>

页面缓存15秒。

1、使用参数改变输出缓存
例程:
一概要面和详情页。单击概要页标题,详情面显示选中的详细信息。
通常会在概要面和详情页间传递一个查询字符串参数来指定显示在详细页中的内容。如果缓存详情页的输出内容,那么就会导致每个人都只能看到第一个选中的内容。
通过使用VaryByParam特性解决这个问题。

数据表
Movies
id  int 自动增长
Title  Nvarchar(50)
Director nvarchar(50)
DateReleased datetime
Description nvarchar(MAX)


主页,master.aspx
<%@ Page Language="C#" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">

</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <asp:GridView ID="grdMovies" AutoGenerateColumns="False" DataSourceID="srcMovies"
            ShowHeader="False" GridLines="None" runat="server">
            <Columns>
                <asp:HyperLinkField DataTextField="Title" DataNavigateUrlFields="id" DataNavigateUrlFormatString="~/Details.aspx?id={0}" />
            </Columns>
        </asp:GridView>
    </div>
    <asp:SqlDataSource ID="srcMovies" runat="server" ConnectionString="<%$ ConnectionStrings:Movies %>"
        SelectCommand="SELECT [id], [Title] FROM [Movies]"></asp:SqlDataSource>
    </form>
</body>
</html>


从页面:Details.aspx
<%@ Page Language="C#" %>

<%@ OutputCache Duration="3600" VaryByParam="id" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">

</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <%=DateTime.Now.ToString("T") %>
        <hr />
        <asp:DetailsView ID="dtlMovie" runat="server" DataSourceID="srcMovies">
        </asp:DetailsView>
    </div>
    <asp:SqlDataSource ID="srcMovies" runat="server" ConnectionString="<%$ ConnectionStrings:Movies %>"
        SelectCommand="SELECT Movies.* FROM Movies  Where Id=@id">
        <SelectParameters>
            <asp:QueryStringParameter Name="id" QueryStringField="Id" Type="Int32" />
        </SelectParameters>
    </asp:SqlDataSource>
    </form>
</body>
</html>


Web.config增加
	<connectionStrings>
  <add name="Movies" connectionString="Data Source=.\SQLEXPRESS;AttachDbFilename=|DataDirectory|\S4_2.mdf;Integrated Security=True;User Instance=True"
   providerName="System.Data.SqlClient" />
 </connectionStrings>


结果:

单击从页

当前时间 11:47
可以看出进行了缓存。
Details.aspx中代码<%@ OutputCache Duration="3600" VaryByParam="id" %>
缓存1小时

VarByParam会导致更多的缓存而不是更少的缓存。

2011-5-17 11:47 danny

2、基于控件变化的输出缓存
VarByControl特性用于根据页面中的特定控件的值生成不同版本的页面缓存。

MasterDetails.aspx
<%@ Page Language="C#" %>

<%@ OutputCache Duration="3600" VaryByControl="dropCategories" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">

</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <%=DateTime.Now.ToString("T") %>
        <hr />
        <asp:DropDownList ID="dropCategories" runat="server" DataSourceID="srcCategories"
            DataTextField="Title" DataValueField="id">
        </asp:DropDownList>
        <asp:Button ID="btnSelect" Text="Select" runat="server" />
        <br />
        <asp:GridView ID="GridView1" runat="server" m GridLines="None" DataSourceID="srcMovies"
            AutoGenerateColumns="False">
            <Columns>
                <asp:BoundField DataField="id" HeaderText="id" InsertVisible="False" ReadOnly="True"
                    SortExpression="id" />
                <asp:BoundField DataField="Title" HeaderText="Title" SortExpression="Title" />
                <asp:BoundField DataField="Director" HeaderText="Director" SortExpression="Director" />
                <asp:BoundField DataField="DateReleased" HeaderText="DateReleased" SortExpression="DateReleased" />
                <asp:BoundField DataField="Description" HeaderText="Description" SortExpression="Description" />
            </Columns>
        </asp:GridView>
        <br />
    </div>
    <asp:SqlDataSource ID="srcCategories" runat="server" ConnectionString="<%$ ConnectionStrings:Movies %>"
        SelectCommand="SELECT [id], [Title] FROM [Movies]"></asp:SqlDataSource>
    <asp:SqlDataSource ID="srcMovies" runat="server" ConnectionString="<%$ ConnectionStrings:Movies %>"
        SelectCommand="SELECT id, Title, Director, DateReleased, Description FROM Movies WHERE id = @id">
        <SelectParameters>
            <asp:ControlParameter ControlID="dropCategories" DefaultValue="Id" Name="id" PropertyName="SelectedValue" />
        </SelectParameters>
    </asp:SqlDataSource>
    </form>
</body>
</html>

2011-5-17 13:05 danny

3、基于头变化的输出缓存
VaryByHeader特性,使得在特定的浏览器头的值变化时,可以创建不同的页面缓存版本。
Accept-Language   
User-Agent
Cookie

varyByHeader.aspx
<%@ Page Language="C#" %>

<%@ OutputCache Duration="3600" VaryByParam="none" VaryByHeader="User-Agent" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">

</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Vary By Header</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <%=DateTime.Now.ToString("T") %>
        <hr />
        <%=Request.UserAgent %>
    </div>
    </form>
</body>
</html>



不同的浏览器有不同的值,不可预知,不建议使用。
2011-5-17 13:17 danny

4、基于浏览器变化的输出缓存
VaryByCustom 值为browser  两个要考虑的:浏览器类型和它的主版本号。
IE 和FireFox不同的页面缓存
IE5、IE6不同的页面缓存

VaryByBrowser.aspx
<%@ Page Language="C#" %>

<%@ OutputCache Duration="3600" VaryByParam="none" VaryByCustom="browser" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">

</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <%=DateTime.Now.ToString("T") %>
        <hr />
        <%=Request.UserAgent %>
    </div>
    </form>
</body>
</html>

其中Maxthon和IE8显示的是同一缓存,但和FireFox是不同的。
由此可见,Maxthon其实用的是IE的内核。

5、基于自定义函数变化的输出缓存
VaryByCustom可以指定一个自定义函数来决定何时生成不同的页面缓存版本。
在Global.asax文件中重写GetVaryByCustomString()方法来创建自定义函数。

VaryByCustom.aspx
<%@ Page Language="C#" %>

<%@ OutputCache Duration="3600" VaryByParam="none" VaryByCustom="css" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">

    protected void Page_Load(object sender, EventArgs e)
    {
        if (Request.Browser.SupportsCss)
            pnlCss.Visible = true;
        else
            pnlNotCss.Visible = true;
    }
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title>Vary by custom</title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <%=DateTime.Now.ToString("T") %>
        <hr />
        <asp:Panel ID="pnlCss" Visible="false" runat="server">
            <span style="font-weight: bold">Hello!</span>
        </asp:Panel>
        <asp:Panel ID="pnlNotCss" Visible="false" runat="server">
            <b>Hello! not css</b>
        </asp:Panel>
    </div>
    </form>
</body>
</html>


其中,IE8,Maxthon和FireFox都是同一缓存的。

2011-5-17 13:33 danny

6、设置缓存位置
<%@OutputCache%>
Location特性指定页面被缓存在哪里
Any  --页面被缓存在浏览器、代理服务器和Web服务器(默认值)
client --页面只缓存在浏览器
DownStream --页面被缓存在浏览器和任何代理服务器,但不缓存在服务器
none  --页面不缓存
ServerAndClient --页面被缓存在浏览器和Web服务器,但不缓存在代理服务器

CacheLocation.aspx
<%@ Page Language="C#" %>

<%@ OutputCache Duration="3600" VaryByParam="none" Location="Client" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">

    protected void Page_Load(object sender, EventArgs e)
    {
        Random rnd = new Random();
        lblRandom.Text = rnd.Next(10).ToString();
    }
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <%=DateTime.Now.ToString("T") %>
        <hr />
        Your random number is:
        <asp:Label ID="lblRandom" runat="server" />
        <br />
        <br />
        <a href="CacheLocation.aspx">Request Page</a>
    </div>
    </form>
</body>
</html>


还是以前一样,Maxthon和IE是同一内核,显示同一缓存,而FireFox是不同的。

7、创建页面输出缓存文件依赖
可以在一缓存页面和硬盘上的一个文件(或一级文件)之间创建一个依赖。当文件修改时,缓存页面自动失效并重新在下次页面请求时生成。

Movies.xml
<?xml version="1.0" encoding="utf-8" ?>
<movies>
  <movie title="Star Wars" />
  <movie title="King Kong" />
  <movie title="The Fly" />
</movies>


OutputCacheFileDependency.aspx
<%@ Page Language="C#" %>

<%@ OutputCache Duration="9999" VaryByParam="none" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<script runat="server">

    protected void Page_Load(object sender, EventArgs e)
    {
        Response.AddFileDependency(MapPath("Movies.xml"));
    }
</script>
<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
    <title></title>
</head>
<body>
    <form id="form1" runat="server">
    <div>
        <%=DateTime.Now.ToString("T") %>
        <hr />
        <asp:GridView ID="GridView1" runat="server" DataSourceID="srcMovies" AutoGenerateColumns="False">
            <Columns>
                <asp:BoundField DataField="title" HeaderText="title" SortExpression="title" />
            </Columns>
        </asp:GridView>
    </div>
    <asp:XmlDataSource ID="srcMovies" runat="server" DataFile="Movies.xml"></asp:XmlDataSource>
    </form>
</body>
</html>

2011-5-17 13:57 danny





分享到:
评论

相关推荐

    asp.net缓存(页面输出缓存和应用程序缓存)

    里面主要包含asp.net常用的两种缓存技术一是页面输出缓存,二是应用程序缓存,有相应的例子两个以上和对应的说明文档

    ASP.NET2.0输出缓存

    对ASP.NET2.0 页面输出缓存和页面部分缓存都有介绍 网络整理的

    ASP.NET 2.0中的页面输出缓存

    静态页面全部内容保存在服务器内存中。当再有请求时,系统将缓存中的相关数据直接输出,直到缓存... 设置页面输出缓存可以使用以下两种方式:一种是使用@ OutputCache指令,另一种是使用页面输出缓存API。@ OutputCac

    asp.net 页面输出缓存

    页面输出缓存是缓存的整个页面 使用很简单&lt;&#37;@ OutPutCache Duration=”60″ VaryByParam=”none”%&gt; Duration:缓存时间 VaryByParam:通过参数来更新缓存的内容 还有其他的一些属性 CacheProfile:调用...

    《零基础学ASP.NET 2.0》第17章 数据缓存

    17.2 使用页面输出缓存 299 17.2.1 启用页面输出缓存 299 17.2.2 按参数改变缓存内容 301 17.2.3 按头改变缓存内容 303 17.2.4 使用自定义字符串改变缓存内容 304 17.2.5 设置缓存位置 305 17.3 使用页面分段缓存 ...

    ASP.NET缓存剖析

    详细介绍静态文件缓存、传统缓存方式、页面输出缓存、页面输出缓存API、页面局部缓存、数据缓存、缓存依赖、客户端缓存、三方缓存。

    C# 系统缓存全解析

    C# .net 系统缓存 很经典的课程 很全面和详细 客户端缓存 服务器端缓存 1.传统缓存 2.页面输出缓存 3.页面输出缓存api 4.应用程序缓存 4.程序和文件依赖缓存 第三方缓存

    php 禁止页面缓存输出

    复制代码 代码如下:&lt;?... header(‘Last-Modified: ‘ . gmdate(‘D, d M Y H:i:s’) .... 您可能感兴趣的文章:PHP使用header()输出图片缓存实例PHP输出缓存ob系列函数详解基于PHP输出缓存(output_b

    ASP.NET缓存的实现

    另外一种缓存机制是页输出缓存,利用它,可以直接获取存放在缓存中的页面,而不需要经过繁杂的对该页面的再次处理。 应用程序缓存其实现原理说来平淡无奇,仅仅是通过ASP.NET管理内存中的缓存空间。放入缓存中的应用...

    ASP.NET 4中的可扩展输出缓存(可以缓存页面/控件等)

    输出缓存的前世今生 ASP.NET 1.0引入输出缓存的概念,这使得开发者可以缓存页面、控件、控制器以及HTTP响应的输出到内存中。在后续的Web请求,ASP.NET就可以使用缓存中的内容更快响应。 ASP.NET的输出缓存系统足够...

    系统缓存全解析-实例

    学习博客园李天平的内容,在VS2008+MS2000上的...系统缓存全解析2:页面输出缓存 系统缓存全解析3:页面局部缓存 系统缓存全解析4:应用程序数据缓存 系统缓存全解析5:文件缓存依赖 系统缓存全解析6:数据库缓存依赖

    比较全面的一个php缓存类.zip

    这不现实,当然,有的时候临时放如服务器缓存,如ob_start()这个缓存页面开启的话在发送文件头之前页面内容都被缓存在内存中,知道等页面输出自动清楚或者等待 ob_get_contents的返回,[或者被ob_end_clean显示的清除,这...

    PHP实现即时输出、实时输出内容方法

    #清除并关闭缓冲,输出到浏览器之前使用这个函数。 ob_end_clean(); #控制隐式缓冲泻出,默认off,打开时,对每个 print/echo 或者输出命令的结果都发送到浏览器。 ob_implicit_flush(1); 例, 复制代码 代码如下: ...

    ASP.NET.4揭秘 卷2

    n428 使用编程方式设置页面输出缓存过期 n429 以编程方式操作页面输出缓存 n4210 创建页面输出缓存配置 n43 使用部分页面缓存 n431 使用缓存后替换 n432 用户控件缓存 n433 共享用户控件的输出缓存 n434 以编程方式...

    首页缓存加速插件(可用于支持asp网站) v1.0.rar

    缓存是数据写在内存里面,比fso去读取静态页面快的多,具体不清楚谁快,但是肯定的是,比直接调用数据库快多了,而且不需要修改数据库,简单修改一下本文件,一切全搞定。只要你的服务器支持xmlhttp组件,一切轻松...

    控制PHP的输出:缓存并压缩动态页面

    在这篇文章里,我将要介绍如何使用PHP的输出控制函数来大幅加速页面载入速度。 介绍PHP的输出控制函数 PHP4中最令人满意的事是——你可以让PHP缓存所有由脚本生成的输出,在你决定把它们送出之前,浏览器方是不会...

    基于PHP输出缓存(output_buffering)的深入理解

    打开了php输出缓存: echo,print -&gt; php output_buffring -&gt; server buffering -&gt; browser buffering -&gt; browser display2.未打开php输出缓存: echo,print -&gt; server buffering -&gt; browser buffering -&gt; browser ...

    充分利用ASP.NET的三种缓存提高站点性能的注意方法

    ASP.NET提供三种主要形式的缓存:页面级输出... 要实现页面输出缓存,只要将一条OutputCache指令添加到页面即可。 &lt;&#37;@ OutputCache Duration=”60″ VaryByParam=”*” %&gt; 它支持五个属性(或参数),其

Global site tag (gtag.js) - Google Analytics