Así que jugué un poco con esto basado en los comentarios aquí. Lo que se me ocurre es contar un contador en un campo simple. En mi aplicación, tengo entidades de fragmentos de código con una propiedad de Vistas.
Cuando un fragmento se considera un método filtra el (lista blanca) justo lo que posiblemente serán navegadores:
public bool LogSnippetView(string snippetId, string ipAddress, string userAgent)
{
if (string.IsNullOrEmpty(userAgent))
return false;
userAgent = userAgent.ToLower();
if (!(userAgent.Contains("mozilla") || !userAgent.StartsWith("safari") ||
!userAgent.StartsWith("blackberry") || !userAgent.StartsWith("t-mobile") ||
!userAgent.StartsWith("htc") || !userAgent.StartsWith("opera")))
return false;
this.Context.LogSnippetClick(snippetId, IpAddress);
}
El procedimiento almacenado a continuación, utiliza una tabla separada para mantener temporalmente las últimas vistas que almacenan la ID de fragmento , fecha introducida y dirección IP. Cada vista se registra y cuando aparece una nueva vista, se verifica para ver si la misma dirección IP ha accedido a este fragmento en los últimos 2 minutos. si es así, no se registra nada.
Si se trata de una vista nueva, la vista se registra (nuevamente SnippetId, IP, ingresada) y el campo Vistas reales se actualiza en la tabla Fragmentos.
Si no es una vista nueva, la tabla se limpia con cualquier vista registrada que tenga más de 4 minutos. Esto debería dar como resultado una cantidad mínima de entradas en la tabla de registro de vista en cualquier momento.
Aquí está el procedimiento almacenado:
ALTER PROCEDURE [dbo].[LogSnippetClick]
-- Add the parameters for the stored procedure here
@SnippetId AS VARCHAR(MAX),
@IpAddress AS VARCHAR(MAX)
AS
BEGIN
SET NOCOUNT ON;
-- check if don't allow updating if this ip address has already
-- clicked on this snippet in the last 2 minutes
select Id from SnippetClicks
WHERE snippetId = @SnippetId AND ipaddress = @IpAddress AND
DATEDIFF(minute, Entered, GETDATE()) < 2
IF @@ROWCOUNT = 0
BEGIN
INSERT INTO SnippetClicks
(SnippetId,IpAddress,Entered) VALUES
(@SnippetId,@IpAddress,GETDATE())
UPDATE CodeSnippets SET VIEWS = VIEWS + 1
WHERE id = @SnippetId
END
ELSE
BEGIN
-- clean up
DELETE FROM SnippetClicks WHERE DATEDIFF(minute,Entered,GETDATE()) > 4
END
END
Esto parece funcionar bastante bien. Como otros mencionaron, esto no es perfecto, pero parece que es lo suficientemente bueno en las pruebas iniciales.
Usted está haciendo una pregunta muy difícil. Solo piense en cómo aborda Google el problema del fraude de clic y obtendrá una idea de cuán grande puede ser la respuesta de su pregunta. – backslash17
Estoy de acuerdo ... no es un problema fácil ... aunque siempre me he preguntado por qué los servidores web no ofrecen buenas soluciones de análisis. Digo bofetada Google Analytics y lo llamo hecho ... a menos que intenten reinventar la rueda francamente reconocida. – madcolor
Entendido, pero es por eso que estoy preguntando aquí: -}. Realmente no busco análisis aquí, pero un contador similar al aquí en SO para mostrar el número de visitas al menos de manera semi-confiable. –