• asp.net中的缓存(一)页面输出缓存


    页面输出缓存

          本缓存机制是.NET环境中比较简单的缓存机制,其作用是将整个aspx页面的内容保存在服务器的内存中。这样,用户在访问该页面的时候,直接从服务器内存中调用,而不用和数据库进行交互,除非缓存数据过期,才重新从数据库取一次数据。这样的环境比较适合于一些经常不用变动的数据页面。

          使用方法非常简单,在aspx页面顶部添加如下声明。

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

     

          对于上面的声明,解释一下参数的意思:

          Duration:缓存过期时间(单位:秒)。上述声明表示本页面在每60秒过期一次(即:在60秒时间内,该页面是读取的服务器缓存里面的数据,并没有直接从数据库获取数据),这个参数是必填的!

          VaryByParam:根据POST(或GET)过来的参数来更新缓存内容,如果需要多个参数,用分号隔开。如果不想要任何参数来修改缓存内容,则将其值设置为:none;如果希望所有的参数都能修改缓存内容,则将其值设置为:*。

          范例如下:

    测试页面缓存 - 前台代码

     1 <%@ Page Language="C#"  CodeBehind="Default.aspx.cs" Inherits="TestWebCache.Default" %>
     2 <%@ OutputCache Duration="60" VaryByParam="none" %>
     3 
     4 <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
     5 
     6 <html xmlns="http://www.w3.org/1999/xhtml" >
     7 <head runat="server">
     8     <title>测试页面缓存</title>
     9 </head>
    10 <body>
    11     <form id="form1" runat="server">
    12         <asp:Literal ID="Literal1" runat="server" />
    13     </form>
    14 </body>
    15 </html>
    1 protected void Page_Load(object sender, EventArgs e)
    2 {
    3     if (!IsPostBack)
    4     {
    5         Literal1.Text = DateTime.Now.ToString();
    6     }
    7 }


     

           如果想根据Url里面的某一个参数进行缓存的更新,则可以在“VaryByParam”的等号后面添加该参数的名称,例如,普通情况下,在访问本页面的时候,我们可以输入Url为:http://localhost:17112/Default.aspx,即使是带有参数的情况下访问该页面,例如:http://localhost:17112/Default.aspx?a=1,也不会对页面的内容有任何的影响,因为在页面顶部声明缓存的时候,我将“VaryByParam”后面的值填的“none”,如果将此值改为上面第二个Url中的参数“a”,则本页面会因为参数“a”的改变而改变页面内容,当“a”在赋相同的值的时候,页面没有变化,如果在页面过期时间(即:60秒)内,改变参数“a”的值,页面的内容也会产生相应的变化。

          如果需要的是多个参数,例如:http://localhost:17112/Default.aspx?a=1&b=2&c=3,那么,在声明页面缓存的时候,应该将“VaryByParam”的值赋为:a;b;c,即:VaryByParam="a;b;c"。

          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 ''"
    10    NoStore="true false"
    11    SqlDependency="database/table name pair CommandNotification"
    12 %>

     

          当然,如果很多页面都添加了页面缓存,而且它们的缓存时间又都设置得是一样的,这个时候,我们就可以利用web.config来统一配置这些缓存的过期时间,这样可以达到一处改动,在多处都能起到相应的作用,配置的范例如下:

    web.config的配置

    <system.web>
    2   <caching>
    3     <outputCacheSettings>
    4       <outputCacheProfiles>
    5         <add name="CacheConfig" duration="60" />
    6       </outputCacheProfiles>
    7     </outputCacheSettings>
    8   </caching>
    </system.web>


     

          这样一来,我们在页面顶部就可以添加如下所示的页面缓存声明方式就可以了:

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

     

          但是需要注意几点:

                1、如果在页面中的用户控件内声明OutputCache,是不支持CacheProfile属性的。

                2、所添加的CacheProfile必须在web.config中存在。

          还可以通过页面中的控件的变化,来修改页面缓存,声明如下所示(假设页面上存在一个ID为DropDownList1的下拉菜单):

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

     

          上面说了这么多,全都是在前台页面上来设置页面缓存,.NET还提供了通过后台代码来实现页面缓存。页面输出缓存API的缓存策略就是用Response的Cache属性,该方式的核心是调用System.Web.HttpCachePolicy。该类主要包含了用户设置缓存特定的HTTP标头的方法和用于控制ASP.NET页面输出缓存的方法。下面说几个常用的方法:

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

        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指令一起使用时,字段扩展名才有效。如果组合不兼容的指令和扩展,则此方法将引发无效参数异常。

  • 相关阅读:
    【转】探秘Java中的String、StringBuilder以及StringBuffer
    【转】深入剖析Java中的装箱和拆箱
    谈谈我对多态的理解
    mysql组合索引之最左原则
    白衣浅谈各个集合的特性
    Linux 下的两个特殊的文件 -- /dev/null 和 /dev/zero 简介及对比
    内网穿透工具的原理与开发实战
    nohup命令说明-转载
    springboot 启动jar正确方式
    maven版本仲裁原则
  • 原文地址:https://www.cnblogs.com/lavenderzh/p/2235791.html
Copyright © 2020-2023  润新知