asp.net-mvc - OutputCache 和记录独特的观点?

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

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

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

例如。

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

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

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

其次,如果 IncrementViewCountFilter 确实知道 questionId .. 并且它获得了很多点击,您不会希望它一直写入 DB .. 但只有当它达到一定数量时 .. 然后你“刷新”输出。

有人有什么想法吗?

最佳答案

好吧,你有几个选择。

donut 缓存

一个服务器端选项是“ donut 缓存”。 donut 缓存 允许缓存大部分页面,而不缓存页面的某些部分( donut 中间的洞)。 donut 缓存 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 - OutputCache 和记录独特的观点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/356164/

相关文章:

mysql - 使用 log4net 存储日志信息

.net - MVC中UIHint属性有什么用

c# - 为什么我的 ActionLink 无法正确生成?

c# - 处理应用程序错误问题

c# - ASP.NET Core Action 筛选器未被调用

ASP.NET MVC4 - OutputCache 异常

c# - 自定义 OutputCache 提供程序在 Add() 和 Set() 上生成不同的键

c# - webforms 中的输出缓存 varybyparams 是否理解路由参数?

c# - Asp.net Core 自定义过滤器实现 IActionModelConvention 和 IFilterFactory

c# - ASP.NET MVC 3 自定义操作过滤器 - 如何将传入模型添加到 TempData?