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

我考虑过创建自己的自定义 ActionFilterAttribute,并使用 Action Filter 执行顺序来记录这个..但我不确定它会起作用。

例如。

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

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

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

其次,如果 IncrementViewCountFilter 确实知道 QuestionId ..而且它的点击率很高,您不会希望它一直写入数据库。但只有当它达到一定数量时..然后你“刷新”输出。

有人有什么想法吗?

有帮助吗?

解决方案

好吧,你有几个选择。

甜甜圈缓存

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

基于图像的跟踪器

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

<img src="/controller/action"> 

在页面上,执行操作的位置 提供一个空图像 在最后。

客户端跟踪

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

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

并且追踪器已开启

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

那么你应该没问题。

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

其他提示

该过滤器可以从ActionExecutingContext.ActionParameters,它被传递给OnActionExecuting得到questionId。至于高速缓存命中次数,以及使用高速缓存。 :)

您也可以使用一个HttpModule这是一个很好的选择,因为它可以用于页和不使用MVC管道等资产。我用甜甜圈缓存的组合,(http://mvcdonutcaching.codeplex.com/),一个MVC滤波器和HTTP模块来记录所有类型的分析的缓存的网页。

我不知道的MVC的一面,但如果我在的WebForms这样做,这听起来像它会是的输出缓存取代又名甜甜圈缓存。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top