Un Contador de Visitantes para nuestro WEBUna solución para contar los visitantes a nuestro WEB usando ASP.NET
Fecha: 06/Jun/2005 (5 de Junio 2005)
|
Introducción
En este artículo se entrega una solución para poder contar efectivamente los visitantes a nuestra página Web. Se explican diferencias entre contadores de hit y visitantes. Se acompaña una ejemplo que resuelve la identificación de la entrada de un visitante por cualquier página que este entre. Finalmente se discute paso por paso la clase usada para la implementación del ejemplo y las limitaciones que la misma puede tener.
SECCION I - Contadores de Hits y Contadores de Visitantes. ¿Que deseamos?
SECCION II - Diferentes soluciones para la adquisición de datos.
SECCION III .- Planificando la infraestructura para un contador de Visitantes basado en una variable de sesión.
SECCION IV.- Implementado una clase para el mantenimiento de la cantidad de visitantes.
Conclusiones
SECCION I - Contadores de Hits y Contadores de Visitantes. ¿Que deseamos?
Despues de un tiempo de desarrollar páginas Web me llego el inevitable pedido de un cliente para la construcción de un contador de visitas para su WEB. Despues de una breve revisión bibliográfica en el WEB me encontre sorprendido que existián pocas soluciones ASP NET que resolvieran la situación de un contador de Visitantes. si existen muchas soluciones para contadores de Hits. Un contador de Hits es aquel que cuenta cualquier requerimiento de una página o varias páginas en particular, sin importarle el origen del mismo.
Un contador de Hits sobre una página, ignorará las entradas por otras páginas y si es un contador de Hits para todas las páginas contará cada página que carge el visitante como si fueran diferentes hits.
Los contadores de hits son útiles para el caso que queramos saber estadísticas sobre las cantidad de veces que nuestras páginas son cargadas y el tráfico que eso genera. Estos contadores no serán tratados en este artículo.
Por otro lado un contador de visitantes, debe poder identificar a cada visitante individualmente y reportarlo como uno solo, aunque recorra diferentes páginas del Web en la misma sesión. Se puede ir mas allá en esta definición y hacer que el Web recuerde entre sesiones un visitante, pero esto no será considerado en nuestra metodología, debido a que a los efectos de un simple contador normalmente se quiere saber el número de visitas que tenemos y no si proceden de diferentes visitantes.
SECCION II - Diferentes soluciones para la adquisición de datos.
Para implementar un contador de visitantes se puede apelar a las siguientes variantes:
- Utilizar un servicio de conteo exterior. Existen WEB que realizan esto por nosotros, muchas son gratuitas. Supongo que obtengan su dinero mediante la venta de estadísticas de visitantes a terceros.
- Utilizar una cookie para identificar el visitante. Este método es posible de implementar en casi todas las tecnologías, con ella se puede obtener de forma simple la identificación del usuario mediante el envío de una cookie limitada en tiempo de vida. Si el visitante tiene la cookie ya estuvo, simple y efectivo. Este método tiene como ventaja adicional que se puede identificar a personas específicas a las que no se quiere contar como visitantes. Vea el siguiente artículo de Paul Freeman-Power si quiere ver una descripción de este método desarrollado en ASP: http://www.developerfusion.co.uk/show/2877/2/
- Utilizar una variable de sesión. Este es una método para ASP NET, sencillamente cada vez que un usuario entra a nuestro web se crea una sesión. Si creamos una variable en dicha sesión ella vivirá mientras el usuario este dentro, al salir la variable termina, si el usuario vuelve a entrar será contado como lo que es, una nueva visita. Como ventaja adicional este método tiene una menor sobrecarga debido a que usamos la propia cookie de sesión de ASP NET y no necesitamos agregar una a nuestra respuesta. Este será el método empleado para nuestro ejemplo.
- Y por último algo que yo utilize por mucho tiempo, un CGI amablemente dispuesto por nuestro proveedor de alojamiento.
SECCION III .- Planificando la infraestructura para un contador de Visitantes basado en una variable de sesión.
Como comentamos en la sección anterior nuestro ejemplo va a estar enfocado en la realización de un código que realiza el conteo de nuestros visitantes basandose en una variable de sesión creada. La solución exibirá las siguientes prestaciones:
- Detección de nuevo visitante por cada apertura de sesión
- Detección del visitante sin importar la página por la cual entre a nuestro Web
- Fichero de almacenamiento de datos tipo texto para un rápido acceso
Para cumplir la primera prestación se utilizará una variable de sesión que se creará para la sesión en curso. Si la variable aún no existe para la sesión en curso, se incrementara el contador de visitantes.
Se ubicará el código de detección de visitantes en una página base, común a todas las páginas para que pueda ejecutar la detección de código común a todas las páginas.
A continuación se muestra un diagrama del modelo propuesto:
Se observa en el modelo anterior que la clase contador dispondra de dos procedimientos separados, uno para Identificar la visita y otro para entregar el resultado almacenado de los visitantes.
Todas las páginas del WEB deben tener una página base para ubicar en ella la rutina de identificación de visitantes. Esta rutina se debe colocar en el evento Page_Load de la página base para garantizar que se ejecuta cada vez que un usuario accese nuestra WEB. Este procedimiento se ocupará de verificar si existe o no la variable de sesión asociada al visitante, y si no existe crearla e incrementar el contador de visitante en ese caso. Esto lo hará leyendo el fichero de texto donde se decida almacenar esta variable y luego incrementándola y volviéndola a guardar.
A continuación se ofrece el diagrama de bloque de dicho método:
El segundo método simplemente lee el fichero con la variable de conteo y lo devuelve. Este solo se debe usar donde queremos mostrar el contador. El método en si, solo devuelve el valor de conteo. La visualización del contador la dejamos a la fantasía del desarrollador. Por cierto una de las cosas que me impulso a escribir este trabajo fue que la mayoría de los contadores existentes son excepcionalmente barrocos, pero en fin al gusto los colores...
A continuación se muestra el diagrama del segundo procedimiento:
A continuación veremos paso por paso la clase empleada.
SECCION IV.- Implementado una clase para el mantenimiento de la cantidad de visitantes.
En nuestro ejemplo construiremos el soporte del contador en una clase aparte en la cual existiran dos métodos
Primero los ensamblados usados, no hay misterios System.Web para poder maniobrar con las variables de sesion y System.IO para poder acceder a el sistema de ficheros.
using System;
using System.Web;
using System.IO;El encabezamiento denuestra clase, en este caso se debe sustituir el namespace por el de su conveniencia, A continuación declaramos las dos variables externas sobre las que va a operar la clase: El fichero de texto que en este caso lo pondremos en un subdirectorio con el objetivo de poder protegerlo contra posibles intrusos y un nombre para la variable de sesión que vamos a usar para identificar si el visitante ya fue contado.
Dos cosas importantes sobre el directorio donde se va a almacenar el fichero de conteo. Este directorio tiene que tener permiso de modificación por parte del usuario ASP NET si no es así recibirá un mensaje de error por parte del programa. Para otorgar este permiso use el exlorador de windows y en la solapa de "seguridad", otórgele los derechos necesarios a ASPNET.
Lo segundo es que se debe proteger este directorio si usted va a usar el contador en un ambiente de producción para que nadie pueda modificar el mismo. Puede usar seguridad ASP NET o integrada de windows.
En nuestro ejemplo colocamos el fichero de texto en un directorio llamado Sealed y lo llamamos Counter.txt.
Observe que están declarados como constantes. La clase no necesitará constructor y además como se verá a continuación sus métodos se implementaran estáticos.
namespace jagg.CM5W.Utiles { /// <summary> /// Summary description for Contador. /// </summary> public class Contador { const string counterfile = @"Sealed\Counter.txt"; const string sessionvar = "checkCounter"; public Contador() { // // TODO: Add constructor logic here // }Ahora el método para contar las visitas, el centro de nuestra aplicación. Lo primero que se hace es preguntar si existe la variable de estado, si esta existe ya se contó el visitante y el programa termina. Si no existe, se crea la variable y se tomas las acciones para contar al visitante.
Para el conteo del visitante se analiza si existe el fichero de texto de conteo, si no existe acabamos de estrenar el programa y por tanto es necesario crearlo. Se crea el fichero y se le asigna valor 1 del primer visitante al web. Si el fichero ya existe pues lo incrementamos y ya.
Observe que el método es estático.
public static bool CountNewVisitor() { //Si existe variable de estado asociada al visitante: TERMINAR return false if (HttpContext.Current.Session[sessionvar] != null){return false;} //Crear la variable de sesion.... HttpContext.Current.Session[sessionvar] = (byte) 0; //Leyendo el fichero..... string fcounter = Variables.FisicalPath + counterfile; string line = "1"; //Si el fichero existe incrementar el valor.... if (File.Exists(fcounter) == true) {//Incrementar el contador........ using (StreamReader sr = new StreamReader(fcounter)) { line = sr.ReadLine(); try { line = Convert.ToString(Convert.ToInt32(line) + 1);} catch{line = "0";} //Proteccion contra corrupción de fichero sr.Close(); } } //Si no existe guarda 1, si existe guarda el valor incrementado using (StreamWriter wr = File.CreateText(fcounter)) { wr.Write(line); wr.Flush(); wr.Close(); } return true; }Este segundo procedimiento es más simple, se limita a leer el fichero de texto y nos devuelve en una variables integer el valor del contador. Si ocurre algún tipo de error en el mismo, nos es devuelto un valor negativo.
public static int GetNumberVisitor() { //Try try { //Si no existe variable de estado asociada al visitante: return -1 TERMINAR if (HttpContext.Current.Session[sessionvar] == null){return -1;} //Si no existe fichero de conteo: return -2 TERMINAR string fcounter = Variables.FisicalPath + counterfile; if (File.Exists(fcounter) != true){return -2;} //Abrir fichero de conteo, leer variable, cerrar fichero de conteo using (StreamReader sr = new StreamReader(fcounter)) { int num = 0; try { num =Convert.ToInt32(sr.ReadLine());} catch{num = -4;} //Proteccion contra corrupción de fichero sr.Close(); return num; } //return valor de conteo } catch { return -3;} } } }Para usar la clase arriba explicada, vamos a asumir que usted quiere censar los visitantes que van a su Web, por cualquiera que sea la página por la que arriben. En este caso debe colocar una llamada al método CountNewVisitor() en el evento Page_Load de la página base, como se ve a continuación:
/// <summary> /// Summary description for PageBase. /// </summary> public class PageBase :Page { public PageBase() { ..... } private void Page_Load(object sender, System.EventArgs e) { Contador.CountNewVisitor(); //Contador de visitante de todas las páginas ........} }Para mostrar el contador sencillamente podemos crear en la página donde deseamos que se vea el número de visitantes (simplemente podemos usar un Label como haremos en nuestro ejemplo) el método adecuado según nuestro gusto para visualizar el contador.
private void Page_Load(object sender, System.EventArgs e)
{
Lconteo.Text = Convert.ToString(Contador.GetNumberVisitor(),10);
}En nuestro HTM de la página simplemente una Label para que ASPNET coloque el valor anterior:
Usted es el visitante: <asp:Label id="Lconteo" runat="server">00000</asp:Label> Conclusiones:
Hemos desarrollado una clase capaz de comportarse como un contador de visitantes bastante confiable, permitiéndonos la contabilidad de los visitantes que lleguen por cualquier lado de nuestro Web.
También se pone de relieve en este trabajo la importancia de diseñar nuestro Web con una clase base, debido a las multiples utilidades que nos puede aportar y lo que nos ahorra de código.
Como limitaciones de esta clase se puede notar que nos contabilizaría a nosotros como visitantes cada vez que vayamos a nuestro Web (bueno al final somos visitas). Si esto nos molesta, se puede solventar incluyendo en nuestra PC una cookie que nos identifique y preguntar por ella al principio del método de CountNewVisitor()
Espacios de nombres usados en el código de este artículo:
using System.Web;
using System.IO;