J'ai donc joué un peu avec ça en me basant sur les commentaires ici. Ce que j'ai trouvé est de compter un compteur dans un champ simple. Dans mon application, j'ai des entités de fragment de code avec une propriété Views.
Lorsqu'un extrait est considéré une méthode filtres sur (liste blanche) juste ce qui devrait, espérons-être les navigateurs:
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);
}
La procédure stockée utilise ensuite une table séparée pour maintenir temporairement les dernières vues qui stockent l'extrait Id , date d'entrée et adresse IP. Chaque vue est enregistrée et lorsqu'une nouvelle vue arrive, elle est vérifiée pour voir si la même adresse IP a accédé à cet extrait au cours des 2 dernières minutes. si c'est le cas, rien n'est enregistré. S'il s'agit d'une nouvelle vue, la vue est enregistrée (à nouveau SnippetId, IP, Entered) et le champ Views est mis à jour dans la table Snippets.
Si ce n'est pas une nouvelle vue, la table est nettoyée avec toutes les vues enregistrées datant de plus de 4 minutes. Cela devrait entraîner un nombre minmal d'entrées dans la table de journal View à tout moment.
Voici le proc stocké:
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
Cela semble fonctionner assez bien. Comme d'autres l'ont mentionné, ce n'est pas parfait, mais il semble que ce soit assez bon pour les tests initiaux.
Vous posez une question très difficile. Réfléchissez à la façon dont Google traite le problème du clic sur mfraud et vous aurez une idée de la taille de votre question. – backslash17
Je suis d'accord .. pas un problème facile .. bien que je me suis toujours demandé pourquoi les serveurs Web n'offrent pas de bonnes solutions d'analyse. Je dis gifler Google Analytics dessus et l'appeler fait .. sauf si vous essayez de réinventer la roue certes cassée. – madcolor
Compris, mais c'est pourquoi je demande ici: -}. Je ne suis pas vraiment après l'analyse ici, mais un compteur similaire à ici sur SO pour afficher le nombre de vues au moins semi-fiable. –