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

leo*_*ora 31 c# asp.net-mvc pageviews

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

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

Sha*_*lle 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; }
    }
}
Run Code Online (Sandbox Code Playgroud)

在你的Global.asax.cs中

public class MvcApplication : HttpApplication 
{
        public static void RegisterGlobalFilters(GlobalFilterCollection filters)
        {
            filters.Add(new PageViewAttribute());
        }
}
Run Code Online (Sandbox Code Playgroud)

对于pre-ASP.Net MVC 3 ,你将不得不手动应用相同的属性,以你的所有行动.

[PageView]
public ActionResult CallOne()
{
}

[PageView]
public ActionResult CallTwo()
{
}
Run Code Online (Sandbox Code Playgroud)

  • 不知道你的数据库是如何设置的......那部分我的朋友由你决定:)在onRemove中看到它在哪里说//将值写出来给数据库 (2认同)

Chr*_*tow 19

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

  • 你能更详细地解释如何缓存值并每隔几分钟使它们失效吗? (2认同)
  • @usr不认为我们想要跟踪所有请求吗?只是页面视图,可以合理地假设为MVC控制器操作. (2认同)

Sha*_*thy 5

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

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

<肥皂盒>

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

如果你真的不想为此目的使用其他工具,我建议你点击你的IIS日志并从那里获取你的统计数据.再一次,为了获得任何真正的决策权,你需要在它上面安装一个好的分析仪.我推荐Splunk:http://www.splunk.com/

</肥皂盒>