2

图像我有一个使用 OutputCache 属性缓存的视图,但我仍然需要增加一个记录该页面已被查看的计数器,我该怎么做?

我考虑过创建自己的自定义 ActionFilterAttribute,并使用 Action Filter Order of Execution 来记录这个......但我不确定它是否会起作用。

例如。

[IncrementViewCountFilter(Order=1)]
[OutputCache(Duration=60,Order=2)]
public ActionResult Index(int questionId)
{ ... }

首先,我在这里的假设是,如果调用了 OutputCache,并且缓存了页面,那么控制器代码将不会运行。

我猜的下一个问题是 IncrementViewCountFilter 不知道 questionId,那么它怎么知道要增加什么(因为它是在执行主索引代码之前执行的)。

其次,如果 IncrementViewCountFilter 确实知道 questionId .. 并且它得到了很多点击,那么您不希望它一直写入数据库 .. 但只有当它达到某个数字时 .. 然后 'flush ' 输出。

有人有什么想法吗?

4

4 回答 4

6

好吧,你有几个选择。

甜甜圈缓存

一种服务器端选项是“甜甜圈缓存”。 甜甜圈缓存允许缓存大部分页面,并且不缓存部分页面(甜甜圈中间的洞)。甜甜圈缓存在此处进行了描述,我使用它取得了巨大的成功。

基于图像的跟踪器

另一种选择是让页面上的图像实际加载记录点击的服务器端操作。这看起来像

<img src="/controller/action"> 

在页面上,该操作在最后提供了一个空图像

客户端跟踪

最后一个选项是客户端跟踪——其中一些脚本在客户端运行并使用 AJAX 调用服务器上的某些内容来记录命中。谷歌在他们的分析包中使用了类似的东西。如果您与跟踪机制位于同一个域中……例如,如果您的主页是:

http://www.domain.com/home/action

跟踪器已开启

http://www.domain.com/tracking/action

那你应该没事。

当您的跟踪器位于不同的域时,这会变得很棘手(您需要使用JSONP或其他一些允许相对安全的跨站点脚本编写的机制来处理这个问题)。

于 2008-12-10T15:01:09.777 回答
1

过滤器可以从 ActionExecutingContext.ActionParameters 中获取 questionId,传递给 OnActionExecuting。至于缓存命中计数,好吧,使用缓存。:)

于 2008-12-10T14:42:38.907 回答
1

您还可以使用 HttpModule,这是一个不错的选择,因为它可用于不使用 MVC 管道的页面和其他资产。我使用 Donut 缓存 (http://mvcdonutcaching.codeplex.com/)、MVC 过滤器和 HttpModule 的组合来记录缓存页面的所有类型的分析。

于 2012-07-13T19:52:16.737 回答
0

我不知道 MVC 方面,但如果我在 WebForms 中这样做,这听起来像是输出缓存替换又名甜甜圈缓存的候选者。

于 2008-12-10T14:22:46.780 回答