Web开发中的缓存技术之二:基于访问时间的简单缓存

没有一劳永逸的缓存技术,每种缓存方式都适用于一种特定场合,本文通过ActionFilter为ASP.NET MVC应用提供一种最简单的基于访问时间的缓存方法。

使用场合:变动不是很频繁的动态页面,比如首页,目录页面之类。

效果描述:每次服务器返回数据给客户机都设置response头中的LastModified值以及浏览器缓存过期时间。下一次浏览器再次访问此url时会在request头中含有Is-Since-Modified信息,服务器将Is-Since-Modified中的日期与当前日期做比较,如果在允许时间差范围内就认为无需为客户浏览器更新数据,直接将HTTP状态置为304。

代码不多,就直接贴出来了。

namespace Sopaco.Lib.Web.Mvc.Performance.Cache
{
    /// <summary>
    /// 仅根据客户机上次访问的时间戳进行简单缓存处理
    /// </summary>
    public class LazyCacheFilter : ActionFilterAttribute
    {
        #region Properties
        public long Seconds = 60;
        public TimeSpan MaxAge = new TimeSpan(1, 0, 0, 0);
        #endregion

        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var request = filterContext.HttpContext.Request;
            var response = filterContext.HttpContext.Response;
            string sinceTag = request.Headers["If-Modified-Since"];
            if (sinceTag != null &&
                TimeSpan.FromTicks(DateTime.Now.Ticks - DateTime.Parse(sinceTag).Ticks).Seconds < Seconds)
            {
                response.StatusCode = 304;
                response.StatusDescription = "Not Modified";
            }
            else
                setClientCaching(filterContext.HttpContext, DateTime.Now);
        }

        #region private Helper Methods
        private void setClientCaching(HttpContextBase context, DateTime time)
        {
            var cache = context.Response.Cache;
            cache.SetETag(time.Ticks.ToString());

            cache.SetLastModified(time);
            cache.SetMaxAge(MaxAge);
            cache.SetSlidingExpiration(true);
            cache.SetCacheability(HttpCacheability.Public);
        }
        #endregion
    }
}

应用:

[HandleError]
    public class HomeController : Controller
    {
        [LazyCacheFilter(Seconds=120)]
        public ActionResult Index()
        {
            //ViewData["Message"] = DateTime.Now.ToString();
            ViewData["Message"] = "this is from asp.net mvc develop server";
            return View();
        }

        public ActionResult About()
        {
            return View();
        }
    }

转载于:https://www.cnblogs.com/wJiang/archive/2010/04/04/1704367.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值