zoukankan      html  css  js  c++  java
  • 系统缓存全解析2:页面输出缓存

    页面输出缓存是最为简单的缓存机制,该机制将整个ASP.NET页面内容保存在服务器内存中。当用户请求该页面时,系统从内存中输出相关数据,直到缓存数据过期。在这个过程中,缓存内容直接发送给用户,而不必再次经过页面处理生命周期。通常情况下,页面输出缓存对于那些包含不需要经常修改内容的,但需要大量处理才能编译完成的页面特别有用。需要读者注意的是,页面输出缓存是将页面全部内容都保存在内存中,并用于完成客户端请求。

    在ASP.NET中页面缓存的使用方法非常的简单,只需要在aspx页的顶部加这样一句声明即可:

    <%@ OutputCache Duration="60" VaryByParam="none" %>

     

    Duration  

    缓存的时间(秒)。这是必选属性。如果未包含该属性,将出现分析器错误。

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="CacheWebApp._16_4_3.WebForm1" %>

    <%@ OutputCache Duration="60" VaryByParam="none" %>

    <html xmlns="http://www.w3.org/1999/xhtml" >

    <head runat="server">

        <title>页面缓存示例</title>

    </head>

    <body>

        <form id="form1" runat="server">

        <div>

            <asp:Label ID="Label1" runat="server" Text="Label"></asp:Label>

        </div>

        </form>

    </body>

    </html>

    后台代码:

           protected void Page_Load(object sender, EventArgs e)

            {

                if (!IsPostBack)

                {

                    Label1.Text = DateTime.Now.ToString();

                }

            }

        如果不加<%@ OutputCache Duration="60" VaryByParam="none" %>,每次刷新页面上的时间每次都是在变。而加了缓存声明以后,每次刷新页面的时间并不变化,60秒后才变化一次,说明数据被缓存了60秒。

    VaryByParam

    是指页面根据使用 POST 或 GET 发送的名称/值对(参数)来更新缓存的内容,多个参数用分号隔开。如果不希望根据任何参数来改变缓存内容,请将值设置为 none。如果希望通过所有的参数值改变都更新缓存,请将属性设置为星号 (*)。

    例如: http://localhost:1165/16-4-3/WebForm1.aspx?p=1
    则可以在WebForm1.aspx页面头部声明缓存:<%@ OutputCache Duration="60" VaryByParam="p" %>

    以上代码设置页面缓存时间是60秒,并根据p参数的值来更新缓存,即p的值发生变化才更新缓存。

    如果一直是WebForm1.aspx?p=1访问该页,则页面会缓存当前数据,当p=2时又会执行后台代码更新缓存内容。

    如果有多个参数时,如:http://localhost:1165/16-4-3/WebForm1.aspx?p=1&n=1

    可以这样声明:<%@ OutputCache Duration="60" VaryByParam="p;n" %> 

    除此之外,@OutputCache 还有一些其他的属性。@OutputCache指令中的属性参数描述如下:

    <%@ OutputCache Duration="#ofseconds"

       Location="Any | Client | Downstream | Server | None |

         ServerAndClient "

       Shared="True | False"

       VaryByControl="controlname"

       VaryByCustom="browser | customstring"

       VaryByHeader="headers"

       VaryByParam="parametername"

       CacheProfile="cache profile name | ''"

       NoStore="true | false"

       SqlDependency="database/table name pair | CommandNotification"

    %>

    CacheProfile

    用于调用Web.config配置文件中设置的缓存时间。这是可选属性,默认值为空字符 ("")。

    例如:

    在Web.config中加入配置:

    <system.web>

        <caching>

            <outputCacheSettings>

                <outputCacheProfiles>

                    <add name="CacheTest" duration="50" />

                </outputCacheProfiles>

            </outputCacheSettings>

    </caching>

    </system.web>

    页面中声明:

    <%@ OutputCache CacheProfile="CacheTest"  VaryByParam="none" %>

    注意:

    包含在用户控件(.ascx 文件)中的 @ OutputCache 指令不支持此属性。在页中指定此属性时,属性值必须与 outputCacheSettings 节下面的 outputCacheProfiles 元素中的一个可用项的名称匹配。如果此名称与配置文件项不匹配,将引发异常。

    如果每个页面的缓存时间相同,则不需要每个页面设置,而是通过统一一个地方控制,这样就可以更好的统一控制所有页面的缓存时间。如果想改变缓存时间,只需要改一下web.config的配置信息即可,而不用每个页面去修改。

    VaryByControl

    通过用户控件文件中包含的服务器控件来改变缓存(值是控件ID,多控件用分号隔开)。

    在 ASP.NET 页和用户控件上使用 @ OutputCache 指令时,需要该属性或 VaryByParam 属性。

    <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm2.aspx.cs" Inherits="CacheWebApp._16_4_3.WebForm2" %>

    <%@ OutputCache Duration="60" VaryByParam="none" VaryByControl="DropDownList1" %>

    <html xmlns="http://www.w3.org/1999/xhtml" >

    <head runat="server">

        <title>根据控件页面缓存</title>

    </head>

    <body>

        <form id="form1" runat="server">

        <div>

             <%=DateTime.Now %>       

            <br>

        <asp:DropDownList ID="DropDownList1" runat="server">

            <asp:ListItem>beijing</asp:ListItem>

            <asp:ListItem>shanghai</asp:ListItem>

            <asp:ListItem>guangzhou</asp:ListItem>

            </asp:DropDownList>

            <asp:Button ID="Button1" runat="server" Text="提交" />

        </div>

        </form>

    </body>

    </html>

    以上代码设置缓存有效期是60秒,并且页面不随任何GET或POST参数改变(即使不使用VaryByParam属性,但是仍然需要在@ OutputControl指令中显式声明该属性)。如果用户控件中包含ID属性为“DropDownList1”的服务器控件(例如下拉框控件),那么缓存将根据该控件的变化来更新页面数据。

    页面输出缓存API

    Response类的Cache属性用于获取页面缓存策略。该方式的核心是调用System.Web.HttpCachePolicy。该类主要包含用于设置缓存特定的HTTP标头的方法和用于控制ASP.NET页面输出缓存的方法。与.NET Framework 1.x中的HttpCachePolicy类相比,.NET Framework 2.0中的HttpCachePolicy类得到了扩充和发展。主要是增加了一些重要方法,例如,SetOmitVarStar方法等。由于HttpCachePolicy类方法众多,下面简要说明几个常用方法。

    SetExpires方法

    用于设置缓存过期的绝对时间。它的参数是一个DataTime类的实例,表示过期的绝对时间。

            protected void Page_Load(object sender, EventArgs e)

            {

                // 通过API设置缓存

                //相当于@OutputCache指令中的Duration属性

                Response.Cache.SetExpires(DateTime.Now.AddSeconds(10));

                Response.Cache.SetExpires(DateTime.Parse("6:00:00PM"));

            }

    如上代码,第一行代码表示输出缓存时间是60秒,并且页面不随任何GET或POST参数改变,等同于“<%@ OutputCache Duration="60" VaryByParam="none" %>”。第二行代码设置缓存过期的绝对时间是当日下午6时整。

    SetLastModified方法

    用于设置页面的Last-Modified HTTP标头。Last-Modified HTTP标头表示页面上次修改时间,缓存将依靠它来进行计时。如果违反了缓存限制层次结构,此方法将失败。该方法的参数是一个DataTime类的实例。

    SetSlidingExpiration方法

    该方法将缓存过期从绝对时间设置为可调时间。其参数是一个布尔值。当参数为true时,Cache-Control HTTP标头将随每个响应而更新。此过期模式与相对于当前时间将过期标头添加到所有输出集的IIS配置选项相同。当参数为False时,将保留该设置,且任何启用可调整过期的尝试都将静态失败。此方法不直接映射到HTTP标头。它由后续模块或辅助请求来设置源服务器缓存策略。

    SetOmitVaryStar方法

    ASP.NET 2.0新增的方法。用于指定在按参数进行区分时,响应是否应该包含vary:*标头。方法参数是一个布尔值,若要指示HttpCachePolicy不对其VaryByHeaders属性使用*值,则为true;否则为false。

    SetCacheability方法

        用于设置页面的Cache-Control HTTP标头。该标头用于控制在网络上缓存文档的方式。该方法有两种重载方式,所不同的是参数。一种重载方法的参数是HttpCacheability枚举值,包括NoCache、Private、Public、Server、ServerAndNoCache和ServerAndPrivate(有关这些枚举值的定义,可参考MSDN)。另一种方法的参数有两个,一个参数是HttpCacheability枚举值,另一个参数是字符串,表示添加到标头的缓存控制扩展。需要注意的是,仅当与Private或NoCache指令一起使用时,字段扩展名才有效。如果组合不兼容的指令和扩展,则此方法将引发无效参数异常。

  • 相关阅读:
    JDBC 复习4 批量执行SQL
    JDBC 复习3 存取Oracle大数据 clob blob
    Oracle复习
    Linux命令(1)grep
    JDBC 复习2 存取mysql 大数据
    JDBC 复习1 DBUtil
    php 环境搭建问题
    Windows 批处理 bat 开启 WiFi 菜单选项 设置ID PWD
    Bat 批处理启动和停止Oracle 服务
    docker 学习1 WSL docker ,Windows docker
  • 原文地址:https://www.cnblogs.com/lingyuan/p/1877432.html
Copyright © 2011-2022 走看看