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秒后过期当再次触发时更新缓存
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缓存。
例如
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 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)、使用配置信息
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);