Лучший способ захватить просмотры страниц для каждого пользователя в asp.net-mvc
Каков наилучший способ захватить просмотр страниц человеком без замедления производительности на сайте. Я вижу, что просмотр stackoverflow просматривает страницы повсюду. Они делают вставку в db каждый раз, когда я нажимаю на страницу?
В asp.net-mvc, есть ли какой-либо рекомендуемый способ отслеживания просмотра страниц для каждого пользователя (у моего сайта есть экран входа в систему), поэтому я могу просмотреть, на какие страницы люди идут и как часто
Ответы
Ответ 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/
</мыльница >