Un Contador de Visitantes para nuestro WEB

Una solución para contar los visitantes a nuestro WEB usando ASP.NET

 

Fecha: 06/Jun/2005 (5 de Junio 2005)
Autor: Jose Alfredo García Guirado  e-mail: Página de Contacto

 


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:

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:

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:

 

 Esquema general

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:

Método de Conteo de Visitantes

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;


 

ir al índice