ASP.NET MVC OutputCacheAttribute 缓存应用

环境: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的代码。

加随机数的按钮可以跳过缓存,一直执行方法拿到当前时间。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

郑小晨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值