OutputCache并录制独特的视图?

时间:2008-12-10 14:10:25

标签: asp.net-mvc outputcache custom-action-filter

图片我有一个使用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确实知道了问题..并且它获得了大量的点击,你不会希望它一直写到数据库......但只有当它达到某个数字时...然后你'冲洗'输出。

有人有任何想法吗?

4 个答案:

答案 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又称甜甜圈缓存的候选者。