c# - una - ¿Cuál es la mejor manera de capturar vistas de página por usuario en asp.net-mvc?
tutorial asp.net mvc 5 español (3)
¿Cuál es la mejor manera de capturar las vistas de página por persona sin ralentizar el rendimiento del sitio? Veo que stackoverflow muestra vistas de página por todo el lugar. ¿Están haciendo una inserción en un db cada vez que hago clic en una página?
En asp.net-mvc, ¿hay alguna forma recomendada de realizar un seguimiento de la visualización de la página por usuario (mi sitio tiene una pantalla de inicio de sesión) para que pueda revisar a qué páginas van las personas y con qué frecuencia?
En primer lugar, si lo que realmente te importa es cómo los clientes usan mi sitio, entonces es probable que quieras consultar Google Analytics o un servicio similar.
Pero si desea un registro de visualización de página rápido y sucio y está utilizando ASP.Net MVC 3, como Chris Fulstow mencionó, deseará utilizar una combinación de filtros de acción global y almacenamiento en caché. Aquí hay un ejemplo.
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; }
}
}
Y en tu Global.asax.cs
public class MvcApplication : HttpApplication
{
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new PageViewAttribute());
}
}
Para pre-ASP.Net MVC 3 SOLAMENTE , tendrá que aplicar el mismo atributo manualmente a todas sus acciones.
[PageView]
public ActionResult CallOne()
{
}
[PageView]
public ActionResult CallTwo()
{
}
La mejor manera probablemente sería un filtro de acción global que intercepte las solicitudes de todas las acciones en todos los controladores, y luego incremente un contador en la base de datos para el usuario y la página actuales. Para ahorrar demasiado en la base de datos, puede almacenar estos valores en caché e invalidarlos cada pocos minutos, dependiendo de la cantidad de tráfico que esté tratando.
Utilizamos el código abierto Piwik: http://piwik.org/ , que se configura en su propio servidor. Una línea de Javascript en la página _Layout realiza una llamada a Piwik después de que la página se haya cargado (ponga el JS al final) y no afecta en absoluto al rendimiento de carga de la página.
Además de solo contar, obtendrá una tonelada de información acerca de dónde provienen sus usuarios, navegador, resoluciones de pantalla, complementos instalados. Además, puede realizar un seguimiento de las conversiones y utilizar la misma herramienta para realizar un seguimiento de las campañas de marketing, etc.
<caja de jabón>
No puedo pensar en una situación en la que sería mejor implementar esto en MVC o en su aplicación web en general. Esto simplemente no pertenece a su aplicación web y es una meta-preocupación que debe ser separada. Este enfoque nos ha permitido realizar un seguimiento de los análisis de todas nuestras aplicaciones (32 de ellas: mvc 2/3, webforms, php ...) de manera unificada.
Si realmente no desea utilizar otra herramienta para este propósito, recomendaría acceder a su registro de IIS y obtener sus estadísticas desde allí. Nuevamente, para obtener cualquier poder real de toma de decisiones, deberás ponerle un buen analizador. Recomiendo Splunk: http://www.splunk.com/
</soapbox>