Così mi sono divertito un po 'in base ai commenti qui. Quello che mi è venuto in mente è contare un contatore in un campo semplice. Nella mia app dispongo di entità frammento di codice con una proprietà Views.
Quando un frammento è visto un metodo di filtri out (lista bianca) proprio quello che dovrebbe essere auspicabilmente browser:
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 stored procedure utilizza quindi una tabella separata per contenere temporaneamente gli ultimi punti di vista che memorizzano il frammento di Id , data di inserimento e indirizzo IP. Ogni vista viene registrata e quando arriva una nuova vista viene controllata per vedere se lo stesso indirizzo IP ha avuto accesso a questo snippet negli ultimi 2 minuti. se è così non viene registrato nulla
Se è una nuova vista, la vista viene registrata (ancora SnippetId, IP, Immessa) e il campo Visualizzazioni effettivo viene aggiornato nella tabella Snippet.
Se non si tratta di una nuova vista, la tabella viene ripulita con qualsiasi vista registrata che abbia più di 4 minuti. Ciò dovrebbe comportare un numero minimo di voci nella tabella Visualizza registro in qualsiasi momento.
Ecco il proc memorizzato:
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
Questo sembra funzionare abbastanza bene. Come altri hanno menzionato, questo non è perfetto ma sembra che sia abbastanza buono nei test iniziali.
Stai facendo una domanda molto difficile. Pensa solo a come Google gestisce il problema con mfraud di clic e avrai un'idea di quanto può essere grande la tua domanda. – backslash17
Sono d'accordo .. non è un problema facile .. anche se mi sono sempre chiesto perché i Web Server non offrono buone soluzioni di analisi. Dico schiaffo su Google Analytics e lo chiamo fatto ... a meno che tu non stia cercando di reinventare la ruota dichiaratamente rotta. – madcolor
Capito, ma è per questo che sto chiedendo qui: -}. Non sono molto interessato all'analisi, ma un contatore simile a qui su SO per mostrare il numero di visualizzazioni almeno in modo semi-affidabile. –