环境:ASP.NET MVC 5
OutputCacheAttribute定义
OutputCacheAttribute→表示一个特性,该特性用于标记将缓存其输出的操作方法。
#region 程序集 System.Web.Mvc, Version=5.2.7.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35
// D:\Git\Online Shipping Request System(eSR).NorthAsia.HUA\trunk\packages\Microsoft.AspNet.Mvc.5.2.7\lib\net45\System.Web.Mvc.dll
#endregion
using System.Web.UI;
namespace System.Web.Mvc
{
//
// 摘要:
// 表示一个特性,该特性用于标记将缓存其输出的操作方法。
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = false)]
public class OutputCacheAttribute : ActionFilterAttribute, IExceptionFilter
{
//
// 摘要:
// 初始化 System.Web.Mvc.OutputCacheAttribute 类的新实例。
public OutputCacheAttribute();
//
// 摘要:
// 获取或设置子操作缓存。
//
// 返回结果:
// 子操作缓存。
public static Runtime.Caching.ObjectCache ChildActionCache { get; set; }
//
// 摘要:
// 获取或设置缓存配置文件名称。
//
// 返回结果:
// 缓存配置文件名称。
public string CacheProfile { get; set; }
//
// 摘要:
// 获取或设置基于标头变化的值。
//
// 返回结果:
// 基于标头变化的值。
public string VaryByHeader { get; set; }
//
// 摘要:
// 获取或设置缓存持续时间(以秒为单位)。
//
// 返回结果:
// 缓存持续时间。
public int Duration { get; set; }
//
// 摘要:
// 获取或设置位置。
//
// 返回结果:
// 位置。
public OutputCacheLocation Location { get; set; }
//
// 摘要:
// 获取或设置一个值,该值指示是否存储缓存。
//
// 返回结果:
// 如果应存储缓存,则为 true;否则为 false。
public bool NoStore { get; set; }
//
// 摘要:
// 获取或设置 SQL 依赖项。
//
// 返回结果:
// SQL 依赖项。
public string SqlDependency { get; set; }
//
// 摘要:
// 获取或设置基于内容变化的编码。
//
// 返回结果:
// 基于内容变化的编码。
public string VaryByContentEncoding { get; set; }
//
// 摘要:
// 获取或设置基于自定义项变化的值。
//
// 返回结果:
// 基于自定义项变化的值。
public string VaryByCustom { get; set; }
//
// 摘要:
// 获取或设置基于参数变化的值。
//
// 返回结果:
// 基于参数变化的值。
public string VaryByParam { get; set; }
//
// 摘要:
// 返回一个值,该值指示子操作缓存否处于活动状态。
//
// 参数:
// controllerContext:
// 控制器上下文。
//
// 返回结果:
// 如果子操作缓存处于活动状态,则为 true;否则为 false。
public static bool IsChildActionCacheActive(ControllerContext controllerContext);
//
// 摘要:
// 此方法是 System.Web.Mvc.IActionFilter.OnActionExecuted(System.Web.Mvc.ActionExecutedContext)
// 的实现并支持 ASP.NET MVC 基础结构。它不应直接在你的代码中使用。
//
// 参数:
// filterContext:
// 筛选器上下文。
public override void OnActionExecuted(ActionExecutedContext filterContext);
//
// 摘要:
// 此方法是 System.Web.Mvc.IActionFilter.OnActionExecuting(System.Web.Mvc.ActionExecutingContext)
// 的实现并支持 ASP.NET MVC 基础结构。它不应直接在你的代码中使用。
//
// 参数:
// filterContext:
// 筛选器上下文。
public override void OnActionExecuting(ActionExecutingContext filterContext);
//
// 摘要:
// 此方法是 System.Web.Mvc.IExceptionFilter.OnException(System.Web.Mvc.ExceptionContext)
// 的实现并支持 ASP.NET MVC 基础结构。它不应直接在你的代码中使用。
//
// 参数:
// filterContext:
// 筛选器上下文。
public void OnException(ExceptionContext filterContext);
//
// 摘要:
// 此方法是 System.Web.Mvc.IResultFilter.OnResultExecuted(System.Web.Mvc.ResultExecutedContext)
// 的实现并支持 ASP.NET MVC 基础结构。它不应直接在你的代码中使用。
//
// 参数:
// filterContext:
// 筛选器上下文。
public override void OnResultExecuted(ResultExecutedContext filterContext);
//
// 摘要:
// 在操作结果执行之前调用。
//
// 参数:
// filterContext:
// 筛选器上下文,它封装有关使用 System.Web.Mvc.AuthorizeAttribute 的信息。
//
// 异常:
// T:System.ArgumentNullException:
// filterContext 参数为 null。
public override void OnResultExecuting(ResultExecutingContext filterContext);
}
}
OutputCacheLocation→用于控制是否输出缓存或保存位置的枚举
#region 程序集 System.Web, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b03f5f7f11d50a3a
// C:\Program Files (x86)\Reference Assemblies\Microsoft\Framework\.NETFramework\v4.6.1\System.Web.dll
#endregion
namespace System.Web.UI
{
//
// 摘要:
// 指定有效值,用于控制资源的输出缓存 HTTP 响应的位置。
public enum OutputCacheLocation
{
//
// 摘要:
// 输出缓存可位于产生请求的浏览器客户端、参与请求的代理服务器(或任何其他服务器)或处理请求的服务器上。此值对应于 System.Web.HttpCacheability.Public
// 枚举值。
Any = 0,
//
// 摘要:
// 输出缓存位于产生请求的浏览器客户端上。此值对应于 System.Web.HttpCacheability.Private 枚举值。
Client = 1,
//
// 摘要:
// 输出缓存可存储在任何 HTTP 1.1 可缓存设备中,源服务器除外。这包括代理服务器和发出请求的客户端。
Downstream = 2,
//
// 摘要:
// 输出缓存位于处理请求的 Web 服务器上。此值对应于 System.Web.HttpCacheability.Server 枚举值。
Server = 3,
//
// 摘要:
// 对于请求的页,禁用输出缓存。此值对应于 System.Web.HttpCacheability.NoCache 枚举值。
None = 4,
//
// 摘要:
// 输出缓存只能存储在源服务器或发出请求的客户端中。代理服务器不能缓存响应。此值对应于 System.Web.HttpCacheability.Private
// 和 System.Web.HttpCacheability.Server 枚举值的组合。
ServerAndClient = 5
}
}
怎么用呢?
在需要使用缓存的Action上添加OutputCache标记,如下
[OutputCache(Duration = 60 * 20,Location = System.Web.UI.OutputCacheLocation.Client)]
[HttpPost]
public ActionResult GetPage(PageInfo pageInfo, ExpandoObject filter)
{
if (string.IsNullOrWhiteSpace(pageInfo.SortExpression))
{
pageInfo.SortExpression = " Sort asc";
}
return Json(OrderBLL.GetPage(pageInfo, filter));
}
Duration = 60 * 20 → 表示缓存时间为20分钟
Location = System.Web.UI.OutputCacheLocation.Client) → 表示缓存保存在客户端
更多参数参考上面的OutputCacheAttribute
如何跳过缓存?
在URL后面加一个随机数就行了
$.ajax({
type:'POST',
url: '@(Url.Action("GetPageData"))?random=' + Math.random(),
data: JSON.stringify({ Data: this.form }),
beforeSend: function () {
},
complete: function () {
},
success: function (result) {
}
});
缓存应用测试
分地址栏请求和ajax的post请求
后台准备一个Get方法,一个Post方法,加上缓存输出,缓存有效时间是10分钟
打上断点,然后去浏览器上测试
GET
在地址栏输入get方法的地址,第一次命中断点,然后一直刷新都不会再命中断点,也就是不会进去方法里面。
good。。。
如果想要跳过(或者说刷新)缓存,只要改变参数的值就可以了。
POST
测试代码如下
@{
ViewBag.Title = "Home Page";
}
<div class="row">
<div style="color:red;">
<h2>@ViewBag.CurrDateTime</h2>
</div>
</div>
<div class="row">
<button onclick="onClick1()">没加随机数</button>
<div id="div1" style="height:100px;width:100%;"></div>
</div>
<div class="row">
<button onclick="onClick2()">加随机数</button>
<div id="div2" style="height:100px;width:100%;"></div>
</div>
<script src="~/Scripts/jquery-3.3.1.min.js"></script>
<script>
function onClick1() {
$.ajax({
type: 'POST',
url: '@(Url.Action("About"))',
data: { Data: "没加随机数" },
beforeSend: function () {
},
complete: function () {
},
success: function (result) {
$("#div1").text(result);
}
});
}
function onClick2() {
$.ajax({
type: 'POST',
url: '@(Url.Action("About"))?random=' + Math.random(),
data: { Data: "加随机数" },
beforeSend: function () {
},
complete: function () {
},
success: function (result) {
$("#div2").text(result);
}
});
}
</script>
没加随机数的按钮第一次命中断点,之后不会命中断点,也就不会执行Action的代码。
加随机数的按钮可以跳过缓存,一直执行方法拿到当前时间。