Каков наилучший способ захвата просмотров страниц на пользователя в asp.net-mvc - PullRequest
30 голосов
/ 21 мая 2011

Каков наилучший способ захвата просмотров страниц человеком без снижения производительности на сайте.Я вижу, что stackoverflow показывает просмотры страниц повсюду.Они делают вставку в БД каждый раз, когда я нажимаю на страницу?

В asp.net-mvc, есть ли какой-нибудь рекомендуемый способ отслеживать просмотр страницы для пользователя (у моего сайта есть экран входа в систему), чтобы я могобзор, на какие страницы люди заходят и как часто

Ответы [ 3 ]

32 голосов
/ 16 июня 2011

Прежде всего .. если вас действительно волнует то, как клиенты используют мой сайт, то вы, скорее всего, захотите посмотреть Google Analytics или аналогичный сервис.

Но если вывам нужна быстрая и грязная запись о просмотре страниц, и вы используете ASP.Net MVC 3, тогда, как отметил Крис Фулстоу, вы захотите использовать сочетание глобальных фильтров действий и кэширования.Вот пример.

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 ТОЛЬКО вы собираетесьнеобходимо применить один и тот же атрибут вручную ко всем вашим действиям.

[PageView]
public ActionResult CallOne()
{
}

[PageView]
public ActionResult CallTwo()
{
}
18 голосов
/ 21 мая 2011

Лучшим способом, вероятно, был бы фильтр глобальных действий , который перехватывает запросы ко всем действиям на всех контроллерах, а затем увеличивает счетчик в базе данных для текущего пользователя и страницы.Чтобы избежать слишком сильного попадания в базу данных, вы можете кэшировать эти значения и делать их недействительными каждые несколько минут, в зависимости от объема трафика, с которым вы работаете.

5 голосов
/ 17 июня 2011

Мы используем открытый исходный код Piwik: http://piwik.org/,, настроенный на его собственном сервере.Одна строка Javascript на странице _Layout вызывает Piwik после загрузки страницы (ставит JS в конце) и не влияет на производительность загрузки страницы.

В дополнение к простому подсчету, вы 'Вы получите массу информации о том, откуда приходят ваши пользователи, браузере, разрешениях экрана, установленных плагинах.Кроме того, вы можете отслеживать конверсии и использовать один и тот же инструмент для отслеживания маркетинговых кампаний и т. Д.

Я не могу вспомнить ситуацию, когда вам было бы лучше реализовать это в MVC илив вашем веб-приложении в целом.Этот материал просто не принадлежит вашему веб-приложению и является мета-проблемой, которую следует выделить.Этот подход позволил нам отслеживать аналитику для всех наших приложений (32 из них: mvc 2/3, веб-формы, php ...) в единой форме.

Если вы действительно не хотите использовать другой инструмент для этой цели, я бы порекомендовал подключиться к вашему журналу IIS и получить оттуда свою статистику.Опять же, для того, чтобы извлечь из этого какие-либо реальные полномочия по принятию решений, вам необходимо установить хороший анализатор.Я рекомендую Splunk: http://www.splunk.com/

...