什么是Cache?
缓存在web应用中是一种以空间换去时间的技术,把频繁访问并且不经常变化的数据存储到内存中,以达到快速访问的目的。在web应用中是比较常见的优化方式。
OutputCacheAttribute
表示一个特性,该特性用于标记将缓存其输出的操作方法。
OutpuCacheAttribute定义
代码片段
[AttributeUsageAttribute(AttributeTargets.Class|AttributeTargets.Method, Inherited = true, AllowMultiple = false)] public class OutputCacheAttribute : ActionFilterAttribute, IExceptionFilter
从上面的代码中可以看到该特性可以应用在类,方法上面。在mvc中,就可以直接在控制器上面或者控制器中的Action上面直接使用,做到细粒度的对缓存的控制。
using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Web.Mvc; namespace Wolfy.OutputCacheDemo.Controllers { [OutputCache(Duration = 10)] public class HomeController : Controller { // GET: Home public string Index() { return DateTime.Now.ToString(); } } }
上面的代码是将OutputCache特性标记在了控制器类上,以达到该控制器上所有的Action都将应用该特性,过期时间设置为10s。10s后缓存过期,再访问就会更新时间。
OutputCache特性也可以设置在Action方法上面,以达到更细粒度的控制缓存。
代码片段
public class HomeController : Controller { [OutputCache(Duration = 10)] // GET: Home public string Index() { return DateTime.Now.ToString(); } }
此时,只有Index的页面进行了缓存。
WebConfig
如果多个控制器或者Action使用相同的缓存配置,可以在配置文件中进行统一配置。
<system.web> <caching> <outputCacheSettings> <outputCacheProfiles > <add name='myoutputcache' duration='10'/> </outputCacheProfiles> </outputCacheSettings> </caching> <compilation debug="true" targetFramework="4.5"/> <httpRuntime targetFramework="4.5"/> </system.web>
应用名称为myoutputcache的缓存
public class HomeController : Controller { [OutputCache(CacheProfile = "myoutputcache")] // GET: Home public string Index() { return DateTime.Now.ToString(); } }
Note:
当控制器和Action同时使用了OutputCache特性时,以Action为主。
OutputCache参数
#region Assembly System.Web.Mvc.dll, v5.2.2.0 #endregion using System; using System.Web.UI; namespace System.Web.Mvc { // Summary: // Represents an attribute that is used to mark an action method whose output // will be cached. [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)] public class OutputCacheAttribute : ActionFilterAttribute, IExceptionFilter { // Summary: // Initializes a new instance of the System.Web.Mvc.OutputCacheAttribute class. public OutputCacheAttribute(); // Summary: // Gets or sets the cache profile name. // // Returns: // The cache profile name. public string CacheProfile { get; set; } // // Summary: // Gets or sets the child action cache. // // Returns: // The child action cache. public static System.Runtime.Caching.ObjectCache ChildActionCache { get; set; } // // Summary: // Gets or sets the cache duration, in seconds. // // Returns: // The cache duration. public int Duration { get; set; } // // Summary: // Gets or sets the location. // // Returns: // The location. public OutputCacheLocation Location { get; set; } // // Summary: // Gets or sets a value that indicates whether to store the cache. // // Returns: // true if the cache should be stored; otherwise, false. public bool NoStore { get; set; } // // Summary: // Gets or sets the SQL dependency. // // Returns: // The SQL dependency. public string SqlDependency { get; set; } // // Summary: // Gets or sets the vary-by-content encoding. // // Returns: // The vary-by-content encoding. public string VaryByContentEncoding { get; set; } // // Summary: // Gets or sets the vary-by-custom value. // // Returns: // The vary-by-custom value. public string VaryByCustom { get; set; } // // Summary: // Gets or sets the vary-by-header value. // // Returns: // The vary-by-header value. public string VaryByHeader { get; set; } // // Summary: // Gets or sets the vary-by-param value. // // Returns: // The vary-by-param value. public string VaryByParam { get; set; } // Summary: // Returns a value that indicates whether a child action cache is active. // // Parameters: // controllerContext: // The controller context. // // Returns: // true if the child action cache is active; otherwise, false. public static bool IsChildActionCacheActive(ControllerContext controllerContext); // // Summary: // This method is an implementation of System.Web.Mvc.IActionFilter.OnActionExecuted(System.Web.Mvc.ActionExecutedContext) // and supports the ASP.NET MVC infrastructure. It is not intended to be used // directly from your code. // // Parameters: // filterContext: // The filter context. public override void OnActionExecuted(ActionExecutedContext filterContext); // // Summary: // This method is an implementation of System.Web.Mvc.IActionFilter.OnActionExecuting(System.Web.Mvc.ActionExecutingContext) // and supports the ASP.NET MVC infrastructure. It is not intended to be used // directly from your code. // // Parameters: // filterContext: // The filter context. public override void OnActionExecuting(ActionExecutingContext filterContext); // // Summary: // This method is an implementation of System.Web.Mvc.IExceptionFilter.OnException(System.Web.Mvc.ExceptionContext) // and supports the ASP.NET MVC infrastructure. It is not intended to be used // directly from your code. // // Parameters: // filterContext: // The filter context. public void OnException(ExceptionContext filterContext); // // Summary: // This method is an implementation of System.Web.Mvc.IResultFilter.OnResultExecuted(System.Web.Mvc.ResultExecutedContext) // and supports the ASP.NET MVC infrastructure. It is not intended to be used // directly from your code. // // Parameters: // filterContext: // The filter context. public override void OnResultExecuted(ResultExecutedContext filterContext); // // Summary: // Called before the action result executes. // // Parameters: // filterContext: // The filter context, which encapsulates information for using System.Web.Mvc.AuthorizeAttribute. // // Exceptions: // System.ArgumentNullException: // The filterContext parameter is null. public override void OnResultExecuting(ResultExecutingContext filterContext); } }
常用的属性
CacheProfile:缓存使用的配置文件的缓存名称。
Duration:缓存时间,以秒为单位,这个除非你的Location=None,可以不添加此属性,其余时候都是必须的。
OutputCacheLocation:枚举类型,缓存的位置。当设置成None时,所有缓存将失效,默认为Any。
namespace System.Web.UI { // Summary: // Specifies the valid values for controlling the location of the output-cached // HTTP response for a resource. public enum OutputCacheLocation { // Summary: // The output cache can be located on the browser client (where the request // originated), on a proxy server (or any other server) participating in the // request, or on the server where the request was processed. This value corresponds // to the System.Web.HttpCacheability.Public enumeration value. Any = 0, // // Summary: // The output cache is located on the browser client where the request originated. // This value corresponds to the System.Web.HttpCacheability.Private enumeration // value. Client = 1, // // Summary: // The output cache can be stored in any HTTP 1.1 cache-capable devices other // than the origin server. This includes proxy servers and the client that made // the request. Downstream = 2, // // Summary: // The output cache is located on the Web server where the request was processed. // This value corresponds to the System.Web.HttpCacheability.Server enumeration // value. Server = 3, // // Summary: // The output cache is disabled for the requested page. This value corresponds // to the System.Web.HttpCacheability.NoCache enumeration value. None = 4, // // Summary: // The output cache can be stored only at the origin server or at the requesting // client. Proxy servers are not allowed to cache the response. This value corresponds // to the combination of the System.Web.HttpCacheability.Private and System.Web.HttpCacheability.Server // enumeration values. ServerAndClient = 5, } }
VaryByParam:用于多个输出缓存的字符串列表,并以分号进行分隔。默认时,该字符串与GET方法传递的参数或与POST方法传递的变量相对应。当被设置为多个参数时,输出缓存将会为每个参数都准备一个与之相对应的文档版本。可能值包括none,*,以及任何有效的查询串或POST参数名称。
结语
由于没找到缓存依赖mysql的办法,关于OutputCache的内容就先到这里。
关于缓存依赖的内容,可参考这篇文章