OutputCache并录制独特的视图?

Pur*_*ome 2 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)
{ ... }
Run Code Online (Sandbox Code Playgroud)

首先,我的假设是,如果调用OutputCache,并且页面被缓存,则不会运行控制器代码.

我猜测的下一个问题是IncrementViewCountFilter不会知道questionId,所以它如何知道要增加什么(因为它是在执行主索引代码之前执行的).

其次,如果IncrementViewCountFilter确实知道了问题..并且它获得了大量的点击,你不会希望它一直写到数据库......但只有当它达到某个数字时...然后你'冲洗' 输出.

有人有什么想法?

Dan*_*rza 6

嗯,你有几个选择.

甜甜圈缓存

一个服务器端选项是'Donut caching'. 甜甜圈缓存允许缓存大部分页面,并且不缓存页面的部分(圆环中间的孔).这里描述了甜甜圈缓存,我已经非常成功地使用了它.

基于图像的跟踪器

另一个选择是让页面上的图像实际加载记录命中的服务器端操作.这看起来像

<img src="/controller/action"> 
Run Code Online (Sandbox Code Playgroud)

在页面上,操作在最后提供空图像.

客户端跟踪

最后一个选项是客户端跟踪 - 其中一些脚本在客户端运行,并使用AJAX调用服务器上的某些内容来记录命中.Google会在其Analytics包中使用类似的内容.如果您与跟踪机制位于同一个域中...就像您的主页是:

http://www.domain.com/home/action
Run Code Online (Sandbox Code Playgroud)

并且跟踪器已开启

http://www.domain.com/tracking/action
Run Code Online (Sandbox Code Playgroud)

那你应该没问题.

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