MVC中outputcache缓存

MVC中outputcache缓存

一、页面缓存 

利用页面输出缓存,可以存储呈现的 HTML,以响应相同页的后续请求。 我们可使用输出缓存来缓存整个网页或仅缓存ASP.NET 控件的输出。页面缓存可让 ASP.NET 向客户端发送页响应,而不必再次经过页处理生命周期。 页输出缓存对于那些不经常更改,但需要大量处理才能创建的页特别有用,可以极大地提高该页的性能。 

可以分别为每个页配置页缓存,也可以在 Web.config 文件中创建缓存配置文件,利用缓存配置文件,只定义一次缓存设置就可以在多个页中使用这些设置。

二、OutPutCache常用属性介绍

1、Duration 

用于设置页面或者用户控件缓存的时间。单位是秒。通过设置该属性,能够为来自对象的HTTP响应建立了一个过期策略,并将自动缓存页或用户控件输出。需要注意的是,Duration属性是必需的,否则将会引起分析器错误。
 

2、OutputCacheLocation

枚举类型,缓存的位置。当设置成None时,所有缓存将失效,默认为Any。

(1)、Any:页面被缓存在浏览器、代理服务器端和web服务器端;

(2)、Client:缓存在浏览器;

(3)、DownStream:页面被缓存在浏览器和任何的代理服务器端;

(4)、Server:页面被缓存在Web服务器端;

(5)、None:页面不缓存;

(6)、ServerAndClient:页面被缓存在浏览器和web服务器端;

3、VaryByParam

用于多个输出缓存的字符串列表,并以分号进行分隔。默认时,该字符串与GET方法传递的参数或与POST方法传递的变量相对应。当被设置为多个参数时,输出缓存将会为每个参数都准备一个与之相对应的文档版本。

可能值包括none,*,以及任何有效的查询串或POST参数名称。

如果您不想要为不同的已缓存内容指定参数,可以将其设置为none。如果想要指定所有的已缓存内容参数,可以设置为*。

4、VaryByCustom

用于自定义输出缓存要求的任意文本。如果赋予该属性值是browser,缓存将随浏览器名称和主要版本信息的不同而异。如果输入了自定义字符串,则必须在应用程序的Global.asax文件中重写HttpApplication.GetVaryByCustomString方法。

 

5、VaryByHeader

该属性中包含由分号分隔的HTTP标头列表,用于使输出缓存发生变化。当将该属性设为多标头时,对于每个指定的标头,输出缓存都包含一个请求文档的不同版本

 

6、NoStore

一个布尔值,用于决定是否阻止敏感信息的二级存储。 将此属性设置为true等效于在请求期间执行代码“Response.Cache.SetNoStore();”。

 

7、CacheProfile

配置文件中设置缓存。 这是可选特性,默认值为空字符串 ('')。

在页中指定此属性时,属性值必须与 outputCacheSettings 节下面的 outputCacheProfiles 元素中的一个可用项的名称匹配。 如果此名称与配置文件项不匹配,将引发异常。

 

 

三、MVC中outputcache缓存实例

 

1、Control缓存

把缓存应用到整个Control上,该Control下的所有Action都会被缓存起来

例如:

在名为Control的Control中加入了OutputCache,并设置持续时间为10秒(Duration=10),即每10秒后过期当再次触发时更新缓存

 

  •  
  • C# 代码   复制
  • 
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    
    namespace MvcCache.Control.Controllers
    {
        [OutputCache(Duration = 10)]
        public class ControlController : Controller
        {
            //
            // GET: /Home/
            public ActionResult Index()
            {
                ViewBag.CurrentTime = System.DateTime.Now;
                return View();
            }
    
            public ActionResult Index1()
            {
                ViewBag.CurrentTime = System.DateTime.Now;
                return View();
            }
    
        }
    }
    
    		
  •  

    2、Action缓存

    把缓存用到Action上,Action缓存为比较常用的缓存方式,该方式粒度细一些,使用方法类似Control缓存。

    例如

     

  •  
  • C# 代码   复制
  • 
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    
    namespace MvcCache.Control.Controllers
    {
        //Control不加缓存
        public class ActionController : Controller
        {
            //该Index的Action加缓存
            [OutputCache(Duration = 10)]
            public ActionResult Index()
            {
                ViewBag.CurrentTime = System.DateTime.Now;
                return View();
            }
    
            //该Action不加缓存
            public ActionResult Index1()
            {
                ViewBag.CurrentTime = System.DateTime.Now;
                return View();
            }
    
        }
    }
    
    		
  • 3、使用CacheProfile属性通过配置文件设置缓存

    当我们需要将N个Control或Action加入缓存,并且缓存的参数是一致的情况下,我们可以把相关的设置放到Web.config中,并在程序中加入相应的配置。

    (1)、配置文件如下:

  •  
  • XML 代码   复制
  • 
    <?xml version="1.0" encoding="utf-8"?>
    
    <configuration>
      <appSettings>
        <add key="webpages:Version" value="2.0.0.0" />
        <add key="webpages:Enabled" value="false" />
        <add key="PreserveLoginUrl" value="true" />
        <add key="ClientValidationEnabled" value="true" />
        <add key="UnobtrusiveJavaScriptEnabled" value="true" />
      </appSettings>
      <system.web>
        <!--配置缓存-->
        <caching>
          <outputCacheSettings>
            <outputCacheProfiles>
              <add name="TestConfigCache" duration="10"/>
            </outputCacheProfiles>
          </outputCacheSettings>
        </caching>
        <!--配置缓存-->
        <httpRuntime targetFramework="4.5" />
        <compilation debug="true" targetFramework="4.5" />
        <pages>
          <namespaces>
            <add namespace="System.Web.Helpers" />
            <add namespace="System.Web.Mvc" />
            <add namespace="System.Web.Mvc.Ajax" />
            <add namespace="System.Web.Mvc.Html" />
            <add namespace="System.Web.Routing" />
            <add namespace="System.Web.WebPages" />
          </namespaces>
        </pages>
      </system.web>
      <system.webServer>
        <validation validateIntegratedModeConfiguration="false" />
    
        <handlers>
          <remove name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" />
          <remove name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" />
          <remove name="ExtensionlessUrlHandler-Integrated-4.0" />
          <add name="ExtensionlessUrlHandler-ISAPI-4.0_32bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\\Microsoft.NET\\Framework\\v4.0.30319\\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness32" responseBufferLimit="0" />
          <add name="ExtensionlessUrlHandler-ISAPI-4.0_64bit" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" modules="IsapiModule" scriptProcessor="%windir%\\Microsoft.NET\\Framework64\\v4.0.30319\\aspnet_isapi.dll" preCondition="classicMode,runtimeVersionv4.0,bitness64" responseBufferLimit="0" />
          <add name="ExtensionlessUrlHandler-Integrated-4.0" path="*." verb="GET,HEAD,POST,DEBUG,PUT,DELETE,PATCH,OPTIONS" type="System.Web.Handlers.TransferRequestHandler" preCondition="integratedMode,runtimeVersionv4.0" />
        </handlers>
      </system.webServer>
    
    </configuration>
    
    		
  • (2)、使用配置信息

  •  
  • C# 代码   复制
  • 
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Web;
    using System.Web.Mvc;
    
    namespace MvcCache.Control.Controllers
    {
        public class ConfigController : Controller
        {
            //TestConfigCache为在配置文件中配置的缓存节
            [OutputCache(CacheProfile = "TestConfigCache")]
            public ActionResult Index()
            {
                ViewBag.CurrentTime = System.DateTime.Now;
                return View();
            }
    
        }
    }
    
    		
  • 注:当Control与Action都应用了缓存时,以Action的缓存为主。

    四、MVC3中outputcache缓存注意事项

    如果使用的是 ASP.NET从1.0到4.0的OutputCache,必须在方法里面加上下面这句

    Response.Cache.SetOmitVaryStar(true);

    标签: