图片我有一个使用OutputCache属性缓存的视图,但我仍然需要增加一个记录页面已被查看的计数器,我该怎么办?
我考虑过创建自己的Custom ActionFilterAttribute,并使用Action Filter Order of Execution来记录这个..但我不确定它是否会起作用。
例如
[IncrementViewCountFilter(Order=1)]
[OutputCache(Duration=60,Order=2)]
public ActionResult Index(int questionId)
{ ... }
首先,我的假设是,如果调用OutputCache,并且页面被缓存,则不会运行控制器代码。
我猜测的下一个问题是IncrementViewCountFilter不会知道questionId,所以它如何知道要递增的内容(因为它是在执行主索引代码之前执行的)。
其次,如果IncrementViewCountFilter确实知道了问题..并且它获得了大量的点击,你不会希望它一直写到数据库......但只有当它达到某个数字时...然后你'冲洗'输出。
有人有任何想法吗?
答案 0 :(得分:6)
嗯,你有几个选择。
一个服务器端选项是'Donut caching'。 甜甜圈缓存允许缓存大部分页面,并且不缓存页面的部分(圆环中间的孔)。甜甜圈缓存is described here,我已经非常成功地使用它了。
另一种选择是在页面上图像实际加载记录命中的服务器端操作。这看起来像
<img src="/controller/action">
页面上的,最后是行动serves up an empty image。
最后一个选项是客户端跟踪 - 其中一些脚本在客户端运行,并使用AJAX调用服务器上的某些内容来记录命中。 Google会在其Analytics包中使用类似的内容。如果您与跟踪机制位于同一个域中...就像您的主页是:
http://www.domain.com/home/action
并且跟踪器已开启
http://www.domain.com/tracking/action
然后你应该没事。
当您的跟踪器位于不同的域时(您需要使用JSONP或其他一些允许相对安全的跨站点脚本编写的机制来处理此问题),这会变得棘手。
答案 1 :(得分:1)
过滤器可以从ActionExecutingContext.ActionParameters获取问题ID,该问题传递给OnActionExecuting。至于缓存命中计数,请使用缓存。 :)
答案 2 :(得分:1)
您还可以使用HttpModule,这是一个不错的选择,因为它可以用于不使用MVC管道的页面和其他资产。我结合使用Donut缓存(http://mvcdonutcaching.codeplex.com/),MVC过滤器和HttpModule来记录缓存页面的所有类型的分析。
答案 3 :(得分:0)
我不知道MVC方面,但如果我在WebForms中这样做,这听起来像是output cache substitution又称甜甜圈缓存的候选者。