【问题标题】:OutputCache and recording unique views?OutputCache 和记录独特的视图?
【发布时间】:2008-12-10 14:10:25
【问题描述】:

图像我有一个使用 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 .. 并且它得到了很多点击,那么您不希望它一直写入 DB .. 但只有当它达到某个数字时.. 然后u '刷新'输出。

有人有什么想法吗?

【问题讨论】:

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


    【解决方案1】:

    嗯,你有几个选择。

    甜甜圈缓存

    一个服务器端选项是“甜甜圈缓存”。 甜甜圈缓存 允许缓存大部分页面,而不缓存部分页面(甜甜圈中间的洞)。甜甜圈缓存is described here,我已经使用它取得了巨大的成功。

    基于图像的跟踪器

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

    <img src="/controller/action"> 
    

    在页面上,动作serves up an empty image在末尾。

    客户端跟踪

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

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

    跟踪器已开启

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

    那你应该没事。

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

    【讨论】:

    • 请注意,甜甜圈缓存在 ASP.NET MVC 2 及更高版本中不起作用。
    【解决方案2】:

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

    【讨论】:

    • 你能提供一些关于从 RouteData 中检索 questionId 的示例代码吗?
    • 对不起,你想要的是 ActionExecutingContext.ActionParameters。这被传递给 ActionFilterAttribute.OnActionExecuting。 (无论如何,在预览版 5 中。)
    • 克尔!缓存命中计数,在缓存中..是的。我打算这样做,但关键是如何以及何时刷新该计数(即:保留该信息)。我在想也许在应用程序启动时创建一个计时器,让它每 xxx 分钟刷新一次?
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      我不了解 MVC 方面,但如果我在 WebForms 中这样做,这听起来像是 output cache substitution aka donut 缓存的候选者。

      【讨论】:

        猜你喜欢
        • 2011-03-27
        • 2022-01-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多