在asp.net-mvc中捕获每个用户的页面浏览量的最佳方法是什么

时间:2011-05-21 02:32:20

标签: c# asp.net-mvc pageviews

在不降低网站性能的情况下,按人数捕获网页浏览量的最佳方法是什么。我看到stackoverflow在整个地方显示页面视图。每次点击页面时,他们是否都在插入数据库?

在asp.net-mvc中,是否有任何推荐的方法来跟踪每个用户的页面浏览量(我的网站有一个登录屏幕)所以我可以查看人们要访问的页面以及频率

3 个答案:

答案 0 :(得分:32)

首先..如果您真正关心的是客户如何使用我的网站,那么您最有可能想要查看Google Analytics或类似的服务。

但是如果你想要一个快速和脏的页面查看记录,并且你正在使用ASP.Net MVC 3,那么当Chris Fulstow提到你将要使用混合的全局动作过滤器和缓存。这是一个例子。

PageViewAttribute.cs 

    public class PageViewAttribute : ActionFilterAttribute
{
    private static readonly TimeSpan pageViewDumpToDatabaseTimeSpan = new TimeSpan(0, 0, 10);

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        var calledMethod = string.Format("{0} -> {1}",
                                         filterContext.ActionDescriptor.ControllerDescriptor.ControllerName,
                                         filterContext.ActionDescriptor.ActionName);

        var cacheKey = string.Format("PV-{0}", calledMethod);

        var cachedResult = HttpRuntime.Cache[cacheKey];

        if(cachedResult == null)
        {
            HttpRuntime.Cache.Insert(cacheKey, new PageViewValue(), null, DateTime.Now.Add(pageViewDumpToDatabaseTimeSpan) , Cache.NoSlidingExpiration, CacheItemPriority.Default,
                                  onRemove);
        }
        else
        {
            var currentValue = (PageViewValue) cachedResult;

            currentValue.Value++;
        }
    }

    private static void onRemove(string key, object value, CacheItemRemovedReason reason)
    {
        if (!key.StartsWith("PV-"))
        {
            return;
        }

        // write out the value to the database
    }

    // Used to get around weird cache behavior with value types
    public class PageViewValue
    {
        public PageViewValue()
        {
            Value = 1;
        }

        public int Value { get; set; }
    }
}

在你的Global.asax.cs

public class MvcApplication : HttpApplication 
{
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new PageViewAttribute());
        }
}

对于pre-ASP.Net MVC 3 ONLY ,您必须手动将相同的属性应用于所有操作。

[PageView]
public ActionResult CallOne()
{
}

[PageView]
public ActionResult CallTwo()
{
}

答案 1 :(得分:18)

最好的方法可能是global action filter拦截对所有控制器上所有操作的请求,然后为当前用户和页面增加数据库中的计数器。为了节省太多的数据库,您可以缓存这些值并每隔几分钟使其无效,具体取决于您要处理的流量。

答案 2 :(得分:5)

我们使用开源Piwik:http://piwik.org/,它在自己的服务器上设置。 _Layout页面中的一行Javascript在页面加载后调用Piwik(将JS放在最后)并且根本不影响页面加载性能。

除了数量之外,您还可以获得大量有关用户来源,浏览器,屏幕分辨率和已安装插件的信息。此外,您还可以跟踪转化情况并使用相同的工具来跟踪营销活动等。

<肥皂盒>

我无法想到你最好在MVC或web应用程序中实现这一点。这些东西根本不属于您的网络应用程序,是一个应该分离出来的元关注点。这种方法使我们能够以统一的方式跟踪所有应用程序(其中32个:mvc 2/3,webforms,php ...)的分析。

如果您真的不想为此目的使用其他工具,我建议您点按IIS日志并从中获取统计信息。再一次,要获得任何真正的决策权,你需要在其上放置一个好的分析器。我推荐Splunk:http://www.splunk.com/

< /肥皂盒>