Подтвердить что ты не робот

Лучший способ захватить просмотры страниц для каждого пользователя в asp.net-mvc

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

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

4b9b3361

Ответ 1

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

Ответ 2

Прежде всего, если вы действительно заботитесь о том, как клиенты используют мой сайт, тогда вы, скорее всего, захотите посмотреть 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()
{
}

Ответ 3

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

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

< мыльница >

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

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

</мыльница >